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

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

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

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

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

--调用Bean的初始化方法

--Bean可以使用了

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

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

【示例】

beans-cycle.xml:

 <?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.hk.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
</beans>

/spring-1/src/com/hk/beans/cycle/Car.java:

 package com.hk.beans.cycle;

 public class Car {
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......");
}
}

/spring-1/src/com/hk/beans/cycle/Main.java:

 package com.hk.beans.cycle;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car); //关闭IOC容器
ctx.close();
}
}

运行结果:

注:通过结果可知Spring IOC容器对Bean的生命周期进行管理的过程和上述一致。

【创建Bean后置处理器】

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

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

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

-postProcessAfterInitialization(Object bean,String beanName)

-postProcessBeforeInitialization(Object bean,String beanName)

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

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

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

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

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

--调用Bean的初始化方法

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

--Bean可以使用了

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

配置文件beans-cycle.xml:

     <!-- 配置bean的后置处理器  -->
<bean class="com.hk.beans.cycle.MyBeanPostProcessor"></bean>

/spring-1/src/com/hk/beans/cycle/MyBeanPostProcessor.java:

 package com.hk.beans.cycle;

 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;
}
}

运行结果:

应用:

首先确定配置文件中value="Audi":

     <bean id="car" class="com.hk.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>

在MyBeanPostProcessor.java中改变postProcessAfterInitialization中的代码:

     public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
Car car = new Car();
car.setBrand("Ford");
return car;
}

运行结果:

【小结】

实现BeanPostProcessor接口,并具体提供两个方法的实现:
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容器自动识别是一个BeanPostProcessor

最新文章

  1. SpringBoot配置属性之DataSource
  2. Qt在pro文件中加入带空格的路径(使用$$quote关键字)
  3. 仿造w3school的试一试功能,实现左侧编辑框,右侧效果页面
  4. 解决 IE 6/7 中console对象兼容性问题
  5. SourceForge无法访问的解决办法
  6. [C#基础]Func和Action学习
  7. SqlServer 存储过程分页
  8. Linux系统编程@多线程与多进程GDB调试
  9. Android异常:异步任务导致的窗口句柄泄漏问题
  10. Pojo和JavaBean的区别(转载)
  11. Windows环境下搭建React Native
  12. 2018-2019-2 《Java程序设计》第4周学习总结
  13. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台
  14. thymeleaf资源加载问题(从Controller跳转)
  15. Iris花逻辑回归与实现
  16. JAVA GC优化入门
  17. Eclipse安装教程
  18. Idea多个module下maven的pom.xml失效的问题
  19. 【commons-httpclient】Java中HttpClient工具访问Web请求
  20. 请你谈谈cookie的利弊

热门文章

  1. Spark 多项式逻辑回归__多分类
  2. E20170528-ts
  3. ----堆栈 STL 函数库 ----有待补充
  4. ASP.Net 知识点总结(四)
  5. 使用Oracle SQL Developer迁移MySQL至Oracle数据库
  6. 数据传递-------ajaxJson------spring3mvc中使用ajax传json中文乱码解决
  7. Linux命令(007) -- systemctl
  8. P2668 斗地主 dp+深搜版
  9. WordPress熊掌号页面改造,自动发布
  10. TensorFlow OOM when allocating tensor with shape[5000,384707]