spring管理bean生命周期
2016-06-03 13:58
573 查看
Spring管理bean的生命周期
1.IOC容器中Bean的生命周期方法
Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。Spring IOC容器对Bean的生命周期进行管理的过程:
1.通过构造器或工厂方法创建Bean实例2.为Bean的属性设置值和对其他Bean的引用
3.调用Bean的初始化方法(init-method)
4.Bean可以使用了
5.当容器关闭时,调用Bean的销毁方法(destory-method)
在Bean的声明里设置init-method和destory-method属性,为Bean指定初始化和销毁方法。
<bean id="car" class="com.wul.spring.beans.cycle.Car" init-method="init2" destroy-method="destroy"> <property name="brand" value="Audi"></property> </bean>init2()和 destory()是Car类里的方法
2.创建Bean后置处理器(更细致的管理bean的生命周期)
Bean后置处理器允许在调用初始化方法(init-method)前后对Bean进行额外的处理。Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性的正确性或根据特定标准更改Bean的属性。
对Bean后置处理器而言,需要实现interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的以下两个方法:
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后置处理器后Bean的生命周期:
Spring IOC 容器对Bean的生命周期进行管理的过程:1.通过构造器或工厂方法创建Bean实例
2.为Bean的属性设置值和对其他Bean的引用
3.将Bean实例传递给Bean后置处理器的 postProcessBeforeInitialization方法
4.调用Bean的初始化方法
5.将Bean实例传递给Bean后置处理器的 postProcessAfterInitialization方法
6.Bean可以使用了
7.当容器关闭时,调用Bean的销毁方法
添加bean后置处理器方法:
1. 实现BeanPostProcessor接口 , 并具体提供postProcessBeforeInitialization和postProcessAfterInitialization的实现2.配置bean
<!-- 配置bean的后置处理器 ,不需要配置id,IOC容器自动识别是一个BeanPostProcessor--> <bean class="com.wul.spring.beans.cycle.MyBeanPostProcessor"></bean>
下面给出示例:
Car.java
package com.wul.spring.beans.cycle; public class Car { public Car() { System.out.println("Car's Constructor..."); } private String brand; public void setBrand(String brand) { this.brand = brand; } public void init2(){ System.out.println("init..."); } public void destroy(){ System.out.println("destroy..."); } @Override public String toString() { return "Car [brand=" + brand + "]"; } }
MyBeanPostProcessor.java
package com.wul.spring.beans.cycle; 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); if("car".equals(beanName)){ //... } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization: "+bean+","+beanName); Car car = new Car(); car.setBrand("Ford"); return car; } }
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.wul.spring.beans.cycle.Car" init-method="init2" destroy-method="destroy"> <property name="brand" value="Audi"></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容器自动识别是一个BeanPostProcessor--> <bean class="com.wul.spring.beans.cycle.MyBeanPostProcessor"></bean> </beans>
Main.java
package com.wul.spring.beans.cycle; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; 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); ctx.close(); } }
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- springmvc 发送ajax出现中文乱码的解决方法汇总
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- 详解Java的MyBatis框架和Spring框架的整合运用
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解