ICO容器中Bean的生命周期方法
•Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
•Spring IOC 容器对 Bean 的生命周期进行管理的过程:
–通过构造器或工厂方法创建 Bean 实例
–为 Bean 的属性设置值和对其他 Bean 的引用
–调用 Bean 的初始化方法
–Bean 可以使用了
–当容器关闭时, 调用 Bean 的销毁方法
•在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
举个栗子
创建一个包com.yorkmass.spring.beans.cycle
里面写上Car类,还有测试主类Main
Car类:
package com.yorkmass.spring.beans.cycle;
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...");
}
}
主类:
package com.yorkmass.spring.beans.cycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//关闭IOC容器
ctx.close();
}
}
创建配置文件beans-cycle.xml
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.yorkmass.spring.beans.cycle.Car"
init-method="init2" destroy-method="destroy">
<!--这里的init-method和destroy-method只是用来指定IOC容器初始和关闭时候执行的方法-->
<property name="brand" value="audi"></property>
</bean>
</beans>
创建Bean后置处理器
添加Bean后置处理器之后Bean的生命周期
•Spring IOC 容器对 Bean 的生命周期进行管理的过程:
–通过构造器或工厂方法创建 Bean 实例
–为 Bean 的属性设置值和对其他 Bean 的引用
–将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
–调用 Bean 的初始化方法
–将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
–Bean 可以使用了
当容器关闭时, 调用 Bean 的销毁方法
举个栗子:
我们需要新建一个类,命名为:MyBeanPostProcessor
该类实现BeanPostProcessor接口
MyBeanPostProcessor类:
package com.yorkmass.spring.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);
Car car=new Car();
car.setBrand("Ford");
return car;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization..."+bean+","+beanName);
if("car".equals(beanName)){
//...处理指定的bean
}
return bean;
}
}
我们在之前的beans-cycle.xml文件里面配置bean的后置处理器:
配置后的beans-cycle.xml代码:
配置bean的后置处理器 :不需要配置id,IOC容器自动识别是一个BeanPostProcessor
<?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.yorkmass.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.yorkmass.spring.beans.cycle.MyBeanPostProcessor"></bean>
</beans>
我们运行Main测试,运行结果:
一月 16, 2019 6:55:07 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@176fe71: startup date [Wed Jan 16 18:55:07 CST 2019]; root of context hierarchy
一月 16, 2019 6:55:07 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans-cycle.xml]
car's Constructor...
setBrand...
postProcessBeforeInitialization...Car [brand=audi],car
init...
postProcessAfterInitialization...Car [brand=audi],car
car's Constructor...
setBrand...
Car [brand=Ford]
一月 16, 2019 6:55:07 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@176fe71: startup date [Wed Jan 16 18:55:07 CST 2019]; root of context hierarchy
destroy...