4.Spring之FactoryBean
[toc]
1.通过工厂创建bean
1.1 静态工厂
- 调用静态工厂方法创建bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节。
- 声明通过静态方法创建的bean需要在bean的class属性里指定静态工厂类的全类名,同时在factory-method属性里指定工厂方法的名称。最后使用
<constrctor-arg>
元素为该方法传递方法参数。
1.2 实例工厂
实例工厂方法:
将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
实现方式
- ①配置工厂类实例的bean
- ②在factory-method属性里指定该工厂方法的名称
- ③使用
construtor-arg
元素为工厂方法传递方法参数
2. FactoryBean
- Spring中有两种类型的bean,一种是普通bean,另一种是工厂bean,即FactoryBean。使用场景:对一些对象想让spring去管理,但是又不希望spring默认去创建,就可以使用FactoryBean。
- 工厂bean跟普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。
- 工厂bean必须实现org.springframework.beans.factory.FactoryBean接口
2.1 bean的作用域
1 | 在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。 |
- 默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。
2.2 bean的生命周期
Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。
Spring IOC容器对bean的生命周期进行管理的过程
①通过构造器或工厂方法创建bean实例
1
2
3public Employee(){
System.out.println("第一步,调用构造器创建对象");
}②为bean的属性设置值和对其他bean的引用
1
2
3
4public void setUsername(String username) {
System.out.println("第二步,调用set方法给对象赋值");
this.username = username;
}③将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法
④调用bean的初始化方法
1
2
3public void init(){
System.out.println("第三步,调用初始化方法");
}⑤将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法
⑥bean可以使用了(第五步省略)
⑦当容器关闭时调用bean的销毁方法
1
2
3public void destroy(){
System.out.println("第五步,调用销毁方法");
}
注意:
在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法
1
<bean id="employee"class="cn.justweb.lifecycle.Employee" p:age="18" p:username="taoge1" init-method="init" destroy-method="destroy"></bean>
bean的后置处理器
- bean后置处理器允许在调用初始化方法前后对bean进行额外的处理
- bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例。其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性。
- bean后置处理器时需要实现接口:
org.springframework.beans.factory.config.BeanPostProcessor
。在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法postProcessBeforeInitialization(Object, String)
postProcessAfterInitialization(Object, String)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("init初始化方法之前");
System.out.println( "o = " + o );
System.out.println( "s = " + s );
return o;
}
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("init初始化方法之后");
System.out.println( "o = " + o );
System.out.println( "s = " + s );
return o;
}
}
2.3 读取配置文件
1 | //原始我们创建dataSource的方式 |
现在通过Spring来完成!注意xml文件中要引入
context名称空间
1 | <!-- |
☆
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jilfoyle!