10.Spring Bean的生命周期

Spring IOC容器可以管理Bean的生命周期,允许在Bean声明周期的特定点执行定制的任务。

Spring IOC容器对Bean的生命周期进行管理的过程。

1.通过构造器或工厂方法创建Bean实例

2.位Bean的属性设置值和对其他Bean的引用

3.调用Bean的初始化方法

4.使用Bean

5.当容器关闭时,调用Bean的销毁方法

在Bean的声明里设置init-method和destory-method属性,为Bean指定初始化和销毁方法。

 

Spring IOC容器提供后置处理器在对IOC容器的所有Bean实例逐一处理,而非单一实例,可以用来检查Bean属性的正确性或根据特定的标准更改Bean的属性。

对与Bean的后置处理器,需要实现BeanPostProcessor接口,在初始化方法前后,Spring将把每个Bean实例分别传递给接口的两个方法postProcessBeforeInitialization和postProcessAfterInitialization。

如果实现了Bean的后置处理器接口。

Bean的生命周期过程则是:

1.通过构造器或工厂方法创建Bean实例

2.位Bean的属性设置值和对其他Bean的引用

3.将Bean实例传递给postProcessBeforeInitialization方法,并调用

4.调用Bean的初始化方法

5.将Bean实例传递给postProcessAfterInitialization方法,并调用

6.使用Bean

7.当容器关闭时,调用Bean的销毁方法

public class Car {//bean类
    public Car() {
        System.out.println("com.cn.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 destory() {
        System.out.println("destroy");
    }
}
public class MyBeanPostProcessor implements BeanPostProcessor{//后置处理器的实现类
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization: " + beanName);
        return bean;
    }
}
<!-- 配置文件 -->
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.cn.Car" init-method="init" destroy-method="destory"> <property name="brand" value="test"></property> </bean> <!-- bean的后置处理器不需要配置id,IOC容器会自动识别后置处理器--> <bean class="com.cn.MyBeanPostProcessor"></bean> </beans>
public class Main {
    public static void main(String[] args) {
//测试代码 ClassPathXmlApplicationContext ctx
= new ClassPathXmlApplicationContext("10.xml"); Car car = (Car) ctx.getBean("car"); System.out.println(car); ctx.close(); } }
//测试结果
com.cn.Car's Constructor setBrand postProcessBeforeInitialization: car init postProcessAfterInitialization: car com.cn.Car@1615f43d destroy

 

posted on 2015-06-19 00:31  jec  阅读(174)  评论(0编辑  收藏  举报

导航