Spring 管理Bean生命周期

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

--SpringIOC容器对Bean的生命周期进行管理的过程:

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

  -为Bean的属性设置值和对其他Bean的引用

  -调用Bean的初始化方法

  -Bean可以使用了

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

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

 

生命周期实列:

Car类:

package com.xia.SpEL;

public class Car {
    private String brand;
    public Car(){
        System.out.println("Car's Constructor");
    }
    
    public void setBrand(String brand) {
        System.out.println("setBrand");
        this.brand = brand;
    }
    
    public void init() {
        System.out.println("init");
    }
    
    public void distory(){
        System.out.println("distory");
    }
    
}    

配置:

<!-- init-method属性和destroy-method属性的值,必须与该类中init方法和distory的方法名相同 -->
<bean id="car" class="com.xia.SpEL.Car" init-method="init" destroy-method="distory"> <property name="brand" value="Audi"></property> </bean>

测试类:

    public static void main(String[] args) throws SQLException {
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");    
        Car car = (Car)ac.getBean("car");
            System.out.println(car);
            
            //关闭IOC容器
        ac.close();
    }

输出:

Car's Constructor        //构造器
setBrand                    //赋值         
init                             //初始化
com.xia.SpEL.Car@1e606a9 //得到对象   
distory                        //销毁Bean

 

创建Bean的后置处理器:

--Bean后置处理器允许在调用初始化方法的前后对Bean进行额外的操作。

--Bean后置处理器对IOC容器里所以Bean实例逐一处理,而非单一实例,其典型应该是:检查Bean属性的正确性或根据特定的标准更改Bean的属性。

--对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的两个方法。

例子:

接着上面例子写:

新建MyBeanPostProcessor类,实现BeanPostProcessor接口:

package com.xia.SpEL;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization: "+bean+" ,"+beanName);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean
            , String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization: "+bean+" ,"+beanName);
        return bean;  //返回bean

} }

配置文件中加以下配置:

<!--
实现BeanPostProcecssor接口, 并具体提供
Object postProcessAfterInitialization(Object bean, String beanName):在init-method之后被调用
Object postProcessBeforeInitialization(Object bean, String beanName):在init-method之前被调用
bean:bean实例本身
beanName:IOC 容器配置的bean 的名字,
返回值是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的Bean,甚至返回一个新的bean
-->


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

再进行测试;

输出:

Car's Constructor
setBrand
postProcessBeforeInitialization: com.xia.SpEL.Car@14c86cf ,car
init
postProcessAfterInitialization: com.xia.SpEL.Car@14c86cf ,car
com.xia.SpEL.Car@14c86cf
distory

 

--添加了Bean后置处理器之后Bean 的生命周期:

  -通过构造器或工厂方法创建Bean的实例

  -为Bean的属性设置值和对其他Bean的引用

  -将Bean实例传给Bean后置处理器的postProcessBeforeInitialization方法处理

  -调用Bean的初始化方法

  -将Bean实例传给Bean后置处理器的postProcessAfterInitialization方法处理

  -Bean可以使用了

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

 

 

 

posted @ 2016-10-02 20:42  夏文杰  阅读(109)  评论(0)    收藏  举报