Bean生命周期和后置处理器
IOC容器的bean生命周期
1.构造器或工厂方法建立bean实例
2.bean属性赋值,引用其他bean
3.bean实例传递给bean后置处理器的BeforeInitialzation()
4.调用bean初始化方法init-method()
5.bean实例传递给bean后置处理器的AfterInitialzation()
6.使用bean实例
7.关闭ioc容器,调用bean销毁方法destory-method()
bean设置了init-method and destroy-method属性
Bean后置处理器
implements BeanPostProcessor实现2个方法
postProcessBeforeInitialization()
postProcessAfterInitialization()
调用初始化方法前后对bean进行额外处理
对所有bean逐一处理
IOC自动识别后置处理器
<?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="cycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="audi"/>
</bean>
<!-- 后置处理器,实现BeanPostProcessor接口的2个方法
postProcessBeforeInitialization在init-method之前调用
postProcessAfterInitialization在int-method之后调用
返回实际的bean,可以修改
不需要配置id,IOC容器自动识别
-->
<bean class="cycle.MyBean"></bean>
</beans>
package cycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* 后置处理器,缺省处理所有的bean
*/
public class MyBean implements BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization : " + beanName );
if ("car".equals(beanName)) {
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization : " + s );
Car car = new Car();
car.setBrand("benz");
return car;
}
}
package cycle;
public class Car {
private String brand;
public Car() {
System.out.println("this is car constructor.");
}
public void setBrand(String brand) {
System.out.println("setting brand ...");
this.brand = brand;
}
public void init() {
System.out.println("init ...");
}
public void destory() {
System.out.println("destory...");
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
'}';
}
}
package 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("cycle//cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
//close IOC container
ctx.close();
}
}