Spring Bean的生命周期

创建阶段
- 调用构造方法
- 如果bean是单例的,并且没有开启懒加载,那么Spring工厂创建的时候就会创建该对象。
如果bean是单例的,但是开启了懒加载,在对象第一次使用的时候创建该对象。
如果bean不是单例的,在使用该对象的时候创建。
初始化阶段
- Spring工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化开发。
- 初始化方法提供:程序员提供
- 初始化方法调用:Spring工厂进行调用。
提供初始化的方法:
-
实现InitializingBean接口:
public void afterProperitesSet() //在此方法中做初始化操作 -
对象中提供一个普通的方法
public void myInit(){ //Spring 怎么知道要调用呢?? init-method="" 配置 } -
注解
@PostConstruct
几种方法的优先级:
//如果三种初始化方法都提供了
@PostConstruct ---> InitializingBean ----> init-method
注入与初始化的顺序:
注入一定发生在初始化的前面。
Spring创建对象(调构造方法) —> DI —> 初始化
销毁阶段
Spring销毁对象前,会调用对象的销毁方法,完成销毁操作。
-
Spring什么时候销毁所创建的对象
ctx.close(); //工厂关闭的时候 -
销毁方法是程序员定义的
调用:Spring调用
-
如何定义销毁方法:
-
实现DisPosableBean接口
public void destroy(){ //完成销毁操作(资源释放) } -
普通的销毁方法
public void myDestroy() throw Exption{ //需要配置 destroyMethod="myDestroy" } -
@preDestroy
几种方法的优先级:
@preDestroy > DisposableBean > destoryMethod
-
注意:销毁操作只适用于singleton
应用实例
前言:有些时候我们需要在创建对象的时候做一些操作,这时候我们可能会选择在构造方法里进行,但是如果构造方法里需要用到成员变量,而成员变量恰好是配置文件通过
@Value注入进来的。这时候因为Spring调用构造方法创建对象的时候成员变量的值还未注入,就会事与愿违。
例如我们在使用Client模拟客户端的时候,会有需要账号密码建立链接的情况。
public TestConnect(){
//获取连接信息
this.client = Client.create();
this.client.addFilter(new HTTPBasicAuthFilter(this.UserName, this.Password));
}
这种写法如果被Spring工厂管理,他的成员变量是不能从配置文件中获取到的。(因为Spring创建一个对象是先调用构造方法再注入)
分析发现建立链接的需求,在初始化也可以完成,并且可以获取到配置文件中的值。
@PostConstruct
public void myInit(){
//获取连接信息
this.client = Client.create();
this.client.addFilter(new HTTPBasicAuthFilter(this.UserName, this.Password));
}
本文详细解析了Spring Bean在创建(构造方法、懒加载和初始化方法)、初始化(InitializingBean接口、init-method和@PostConstruct)和销毁(DisposableBean接口、destoryMethod和@preDestroy)阶段的行为,以及实际应用中的注意事项。
1万+

被折叠的 条评论
为什么被折叠?



