管理Bean的生命周期

IOC容器中Bean的生命周期方法

  • SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。
  • Spring IOC容器对Bean的生命周期进行管理的过程
    • 通过构造器或工厂方法创建Bean
    • 为Bean的属性设置值和对其他Bean的引用
    • 调用Bean的初始化方法
    • Bean可以使用了
    • 当容器关闭时,调用Bean的销毁方法
  • 在Bean的声明里设置init-method和destroy-method属性。为Bean指定初始化和销毁方法。

Car.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Car{
public Car(){
System.out.println("Car's Constructor...");
}

private String brand;

public void setBrand(String brand){
System.out.println("setBrand...");
this.brand = brand;
}

public void init(){
System.out.println("init...");
}

public void destroy(){
System.out.println("destroy...");
}
}

Bean.XML

1
2
3
4
<bean id = "car" class = "com.Spring.test.Car" 
init-method = "init" destroy-method = "destroy">
<property name = "Brand" value = "Audi" />
</bean>

Main.XML

1
2
3
4
5
6
7
8
9
10
11
public class Main{
public static void main(String[] args){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("Bean.xml");

Car car = (Car)ctx.getBean("car");
System.out.println(car);

//关闭IOC容器
ctx.close();
}
}

输出结果:
Car's Constructor...
setBrand
init...
com.Spring.test.Car@bb23423
destory..

创建Bean后置处理器

  • Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理
  • Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性
  • 对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后。Spring将把每个Bean实例分别传递给上述接口的以下两个方法:

添加Bean后置处理器后Bean的生命周期

  • SpringIOC容器对Bean的生命周期进行管理的过程:
    • 通过构造器或工厂方法创建Bean实例
    • 为Bean的属性设置值和对其他Bean的引用
    • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
    • 调用Bean的初始化方法
    • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
    • Bean可以使用了
    • 当容器关闭时,调用Bean的销毁方法

具体操作:

MyBeanPostProcessor.java

1
2
3
4
5
6
7
8
9
10
11
12
public class myBeanPostProcessor implements BeanPostProcessor{
@override
public Object postProcessBeforeInitialization(Object bean,String beanName) throws BensException{
System.out.println("postProcessBeforeInitialization:" + bean + " " + beanName);
return bean;
}
@override
public Object postProcessAfterInitialization(Object bean,String beanName) throws BensException{
System.out.println("postProcessAfterInitialization:" + bean + " " + beanName);
return bean;
}
}

Bean.XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id = "car" class = "com.Spring.test.Car" 
init-method = "init" destroy-method = "destroy">
<property name = "Brand" value = "Audi" />
</bean>
<!--
实现BeanPostProcessor接口,并具体提供Object postProcessBeforeInitialization(Object bean,String beanName):init-method之前被调用
实现BeanPostProcessor接口,并具体提供Object postProcessAfterInitialization(Object bean,String beanName):init-method之后被调用

bean: bean实例本身
beanName: IOC容器配置的bean的名字
返回值: 是实际上返回给用户的哪个Bean,注意:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean
-->

<!-- 配置bean的后置处理器:不需要配置id,IOC容器自动识别是一个BenaPostProcessor -->
<bean class = "com.Spring.test.MyBeanPostProcessor"></bean>

输出结果:
Car's Constructor...
setBrand
postProcessBeforeInitialization:com.Spring.test.Car@bb23423 car
init...
postProcessBeforeInitialization:com.Spring.test.Car@bb23423 car
com.Spring.test.Car@bb23423
destory..

添加Bean后置处理器后Bean的生命周期

  • SpringIOC容器对Bean的生命周期进行管理的过程:
    • 通过构造器或工厂方法创建Bean实例
    • 为Bean的属性设置值和对其他Bean的引用
    • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
    • 调用Bean的初始化方法
    • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
    • Bean可以使用了
    • 当容器关闭时,调用Bean的销毁方法
-------------本文结束 感谢您的阅读-------------
文章对我有益,我要小额赞赏...