您的位置:首页 > 编程语言 > Java开发

Spring_管理bean的生命周期(8)

2018-04-01 09:30 447 查看
IOC 容器中 Bean 的生命周期方法
1、Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. 
2、Spring IOC 容器对 Bean 的生命周期进行管理的过程:
通过构造器或工厂方法创建 Bean 实例
为 Bean 的属性设置值和对其他 Bean 的引用
调用 Bean 的初始化方法
Bean 可以使用了
当容器关闭时, 调用 Bean 的销毁方法
3、在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
比如定义一个Car类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 init2(){
System.out.println("init...");
}

public void destroy(){
System.out.println("destroy....");
}
}配置文件:beans-cycle.xml<bean id="car" class="com.wgs.spring.beans.cycle.Car"
init-method="init2"
destroy-method="destroy">
<property name="brand" value="BaoMa"></property>
</bean>Main.java文件:public static void main(String[] args) {

ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");

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

//关闭IOC容器
((AbstractApplicationContext) ctx).close();
}运行结果为:

Car's Constructor.....
setBrand...
init...
com.wgs.spring.beans.cycle.Car@6a41eaa2

destroy....

创建 Bean 后置处理器

1、Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
2、Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

3、对Bean 后置处理器而言, 需要实现    (org.springframework.beans.factory.config) Interface BeanPostProcessor 接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:



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


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


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

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

3、将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

4、调用 Bean 的初始化方法

5、将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

6、Bean 可以使用了

7、当容器关闭时, 调用 Bean 的销毁方法
        上述代码不变:增加了一个MyBeanPostProcessor.java并修改了beans-cycle.xml

MyBeanPostProcessor.java代码实现:

package com.wgs.spring.beans.MyBeanPostProcessor;

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

public class MyBeanPostProcessor implements BeanPostProcessor {

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

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization: "+bean+","+beanName);
return bean;
}
}
beans-cycle.xml的修改:
<bean id="car" class="com.wgs.spring.beans.cycle.Car"
init-method="init2"
destroy-method="destroy">
<property name="brand" value="BaoMa"></property>
</bean>

<!--
实现BeanPostProcessor接口,并具体提供以下两个方法的实现
Object postProcessBeforeInitialization(Object bean, String beanName) :init-method之前被调用
Object postProcessAfterInitialization(Object bean, String beanName) :init-method之后被调用

bean:bean 实例本身
beanName: IOC容器配置的bean的名字
返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean
-->
<!-- 配置bean 的后置处理器 :不需要配置id。IOC容器自动识别是一个BeanPostPorcessor-->
<bean class="com.wgs.spring.beans.MyBeanPostProcessor.MyBeanPostProcessor"></bean>
运行结果为:
Car's Constructor.....
setBrand...
postProcessBeforeInitialization: com.wgs.spring.beans.cycle.Car@1bce4f0a  ,  car
init...
postProcessBeforeInitialization: com.wgs.spring.beans.cycle.Car@1bce4f0a  ,  car
com.wgs.spring.beans.cycle.Car@1bce4f0a
destroy....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: