管理Bean的生命周期
【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
管理Bean的生命周期的更多相关文章
- Spring4.0学习笔记(5) —— 管理bean的生命周期
Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...
- Spring_管理bean的生命周期
Spring IOC 容器对 Bean 的生命周期进行管理的过程:通过构造器或工厂方法创建 Bean 实例为 Bean 的属性设置值和对其他 Bean 的引用将 Bean 实例传递给 Bean 后置处 ...
- 【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?
写在前面 在<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!>一文中,我们讲述了如何使用@Bean注解来指定bean初始化和销毁的方法.具体的 ...
- Spring——管理Bean的生命周期
我们可以自定义bean的初始化和销毁方法,这里所指的的初始化和bean的构造不同,初始化是在bean构造完成后,对bean内部的属性或一些逻辑进行初始化. 首先要弄清一些概念: 构造(对象创建) 单实 ...
- Spring管理bean的生命周期
1: bean的创建: 如果我们默认的scope配置为Singleton的话, bean的创建实在Spring容器创建的时候创建: 如果scope的配置为Prototype的话,bena的创建是在 ...
- Spring_管理 Bean 的生命周期
beans-cycle.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&quo ...
- IOC容器中bean的生命周期
一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...
- 使用外部属性文件配置Bean以及Bean的生命周期方法
1.使用外部属性文件配置Bean 在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean ...
- Spring的Bean的生命周期以及Bean的后置处理器
Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进 ...
随机推荐
- SQL Server 方言类型映射问题
关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取
- U - Relatives(欧拉函数)
Description Given n, a positive integer, how many positive integers less than n are relatively prime ...
- web api 二
接着上一回说,上回说到,web api有几种访问方式,具体有几种,我还真没去研究过,但是这里打算从get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/date ...
- 数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension Req ...
- Ray Wenderlich 的 Objective-C编码规范
由于我正在准备模仿饿了么这个app,到时可能有些iOS开发者参与进来.这时如果每个人的Objective-C编码风格都不一样,这样不易于保持代码一致性和难以Code Review.所以我在网上搜索到 ...
- C语言学习(1)-环境配置
写在前面的话,该文章是看杨老师的一套视频,所做的一些笔记,边看边写,再此谢谢杨老师. 1.学习C之前需要避免的误区 误区一:C++是C的升级版:C#是C++的升级版 误区二:C/C++就是Visual ...
- 滚动时sticky nav
参考w3c <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <met ...
- 转载--Beautifuisoup的使用
转载自--http://mp.weixin.qq.com/s?src=11×tamp=1520511185&ver=742&signature=KDzYoOg8Xd9 ...
- PHP开发心得二
如何解决错误:PHP SOAP Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML documen ...
- solr深分页,游标操作分页,解决性能问题
solr深分页,游标操作分页,解决性能问题 @Test public void pageByCursor() { try { solrServer.connect(); String query = ...