使用外部属性文件配置Bean以及Bean的生命周期方法
1.使用外部属性文件配置Bean
在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离。Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 变量,Spring 2.5 之后,可通过 <context:property-placeholder> 元素简化。
示例:在外部属性文件中进行数据库的连接配置。
配置文件beans-properties.xml中进行配置:
<!--导入属性文件-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--${var} var要与外部属性文件中的key一致-->
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
</bean>
外部属性文件db.properties文件内容:
user=root
password=0404
jdbcUrl=jdbc:mysql://localhost:3303/extra
driverClass=com.mysql.jdbc.Driver
2.Spring表达式语言SpEL
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL。它 为 bean 的属性进行动态赋值提供了便利。
通过 SpEL 可以实现:
- 通过 bean 的 id 对 bean 进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
示例代码:
Address.java
package com.java.spring.SpEL; public class Address {
private String city;
private String street;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [city=" + city + ", street=" + street + "]";
}
}
Car.java
package com.java.spring.SpEL; public class Car { private String brand;
private double price;
private String tyrePrimeter;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getTyrePrimeter() {
return tyrePrimeter;
}
public void setTyrePrimeter(String tyrePrimeter) {
this.tyrePrimeter = tyrePrimeter;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + ", tyrePrimeter=" + tyrePrimeter + "]";
} }
Person.java
package com.java.spring.SpEL; public class Person {
private String name;
private Car car;
//引用Address的city属性
private String city;
private String info;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", car=" + car + ", city=" + city + ", info=" + info
+ "]";
} }
在xml中进行配置:(使用SpEL)
<bean id="address" class="com.java.spring.SpEL.Address">
<property name="city" value="上海"></property>
<property name="street" value="南京路"></property>
</bean>
<bean id="car" class="com.java.spring.SpEL.Car">
<property name="brand" value="Audi"></property>
<property name="price" value="300000.0000"></property>
<!-- 使用SpEL的T()调用一个类的静态方法 -->
<property name="tyrePrimeter" value="#{(T(java.lang.Math).PI)*3}"></property>
</bean>
<bean id="person" class="com.java.spring.SpEL.Person">
<property name="name" value="Tom"></property>
<!-- 使用SpEL引用其他Bean -->
<property name="car" value="#{car}"></property>
<!-- 使用SpEL引用其他对象的属性 -->
<property name="city" value="#{address.city}"></property>
<!-- 在SpEL中使用运算符 -->
<property name="info" value="#{car.price>300000.000?'金领':'白领'}"></property>
</bean>
在主方法中实例化Bean:
package com.java.spring.SpEL; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-SpEL.xml");
Person person=(Person)ctx.getBean("person");
System.out.println(person);
}
}
运行后输出:
Person [name=Tom, car=Car [brand=Audi, price=300000.0, tyrePrimeter=9.42477796076938], city=上海, info=白领]
3.IOC 容器中 Bean 的生命周期方法
Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例;
- 为 Bean 的属性设置值和对其他 Bean 的引用;
- 调用 Bean 的初始化方法;
- Bean 可以使用了;
- 当容器关闭时, 调用 Bean 的销毁方法;
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。
示例代码:
Car.java
package com.java.spring.Cycle; public class Car {
//1.通过构造器或工厂方法创建 Bean 实例;
public Car(){
System.out.println("Car's constructor...");
}
private String brand;
//3.调用 Bean 的初始化方法;
public void init(){
System.out.println("Car's init method...");
}
//2.为 Bean 的属性设置值和对其他 Bean 的引用;
public void setBrand(String brand){
System.out.println("Car's setBrand method...");
this.brand=brand;
}
public void destroy(){
System.out.println("Car's destroy method...");
}
@Override
public String toString() {
return "Car [brand=" + brand + "]";
}
}
在xml中进行配置:
<bean id="car" class="com.java.spring.Cycle.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
在主方法中实例化并且关闭IOC容器:
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
//4.Bean 可以使用了;
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//5.当容器关闭时, 调用 Bean 的销毁方法;
ctx.close();
}
运行后输出:
Car's constructor...
Car's setBrand method...
Car's init method...
Car [brand=Audi]
Car's destroy method...
使用外部属性文件配置Bean以及Bean的生命周期方法的更多相关文章
- Spring 使用外部属性文件配置
1.Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean的配置的部分内容 移到属性文件中.可以在Bean配置 ...
- Spring 应用外部属性文件 配置 context 错误
在Spring配置文件中出现通配符的匹配很全面, 但无法找到元素 'context:property-placeholder' 的声明这个错误,其实主要是我们在引入命名空间时没有正确引入它的DTD解析 ...
- IoC容器-Bean管理XML方式(引入外部属性文件)
IoC操作Bean管理(引入外部属性文件) 1,直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池依赖jar包 2,通过引入外部属性文件配置数据库连接池 (1)创建外部属性文件,pro ...
- Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
- Spring - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配1.1 使用:只需在<bean>中使用autowire元素<bean id="student" class="com.kej ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring(十):Spring配置Bean(三)Bean的作用域、使用外部属性文件
Bean的作用域: 支持四种配置,分别是singleton,prototype,request,session. singleton 默认情况下在spring confinguration xml文件 ...
- Spring-Bean配置-使用外部属性文件(转)
Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...
- spring4-2-bean配置-6-使用外部属性文件
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk0AAAFGCAIAAAD4tzxRAAAgAElEQVR4nO2d27HsOm+tOxWn4CeXAm ...
随机推荐
- JQuery Mobile - 修改复选框的选中状态无效解决办法!
今晚,在编写JQuery Mobile程序时候,需要在代码里面控制复选框的选中状态,很简单的代码啊,很快完成了!等测试程序时候傻眼了,页面无论如何也不按照我写的代码显示出来!问题出在哪里呢?是我写的控 ...
- Flask的WTforms
一.简单介绍 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 类似于Django中的modelform 安装: pip3 install wtforms 二.简 ...
- Java程序员的日常—— Spring Boot单元测试
关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等 ...
- 微信小程序一些总结
1.体验版和线上是啥区别,啥关系 在微信开发者工具里提交代码后进入体验版,在微信后台里点击版本管理,就可以看到线上版本,和开发体验版,描述里有提交备注. 在体验版里发布审核之后会进入到线上.他们两个可 ...
- html5聊天案例|趣聊h5|仿微信界面聊天|红包|语音聊天|地图
之前有开发过一个h5微直播项目,当时里面也用到过聊天模块部分,今天就在之前聊天部分的基础上重新抽离模块,开发了这个h5趣聊项目,功能效果比较类似微信聊天界面.采用html5+css3+Zepto+sw ...
- web前端导出csv文件
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- ElasticSearch-SQL 安装和使用
ES上线之后,用lucene语法来查询数据,学习成本略高,所以考虑用es-sql来简化这部分的操作. ES版本:5.4.0,节点部署如下: master node:3 client node:2,po ...
- Spring Security构建Rest服务-0702-个性化用户认证流程2
登录成功后的处理AuthenticationSuccessHandler: 认证成功后,默认情况下spring security会继续访问之前访问的url,如果想自定义处理逻辑,用默认的就不行了.此时 ...
- WordPress主题制作导航的N种方法
在WordPress主 题制作中,导航菜单的制作算是一个重点,已经写好导航菜单的HTML代码,放在WordPress主题中如何动态调用呢?本文将给你介绍几种编写PHP代 码动态实现导航的方法,本文也将 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- 理解主窗体构造函数
MyWidget做父窗体 MyWidget的构造函数中可以手动添加组件 Ui::MyWidget存放子部件 Ui::MyWidget执行setupUi()函数为子部件开辟空间,指定父窗体 MyWidg ...