一、未加入BeanPostProcessor前的生命周期
二、加入BeanPostProcessor生命周期后的生命周期
三、代码说明
1、applicationContext.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.lh.bean_cycle.bean.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
<!--
1、实现BeanPostProcessor接口,并具体提供
Object postProcessBeforeInitialization(Object bean, String beanName):init-method方法前调用
Object postProcessAfterInitialization(Object bean, String beanName):init-method方法后调用
的实现。
bean:实例本身
beanName:IOC容器配置的bean的名字
返回值:实际上返回给用户的bean,注:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean(偷梁换柱)
无需指定id
-->
<bean class="com.lh.bean_cycle.config.MyBeanPostProcessor"/>
</beans>
2、MyBeanPostProcessor.java
package com.lh.bean_cycle.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import com.lh.bean_cycle.bean.Car;
/**
* @ClassName: MyBeanPostProcessor
* @Description: TODO
* @author Liu
* @date 2018年6月1日 下午9:34:16
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("----------------postProcessBeforeInitialization--------------" + bean + "," + beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("----------------postProcessAfterInitialization--------------" + bean + "," + beanName);
if(bean instanceof Car) {
return new Car("Ford");
}
return bean;
}
}
3、Car.java
package com.lh.bean_cycle.bean;
/**
* @ClassName: Car
* @Description: Car定义
* @author Liu
* @date 2018年6月1日 下午9:22:17
*/
public class Car {
private String brand;
public Car() {
System.out.println("Car's constructor...");
}
public Car(String brand) {
this.brand = brand;
}
public void setBrand(String brand) {
System.out.println("Car's setBrand()...");
this.brand = brand;
}
@Override
public String toString() {
return "Car [brand=" + brand + "]";
}
// bean的初始化方法
public void init() {
System.out.println("Car's init()...");
}
// bean的销毁方法
public void destroy() {
System.out.println("Car's destroy()...");
}
}
4、输出结果
package com.lh.bean_cycle;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lh.bean_cycle.bean.Car;
/**
* @ClassName: Main
* @Description: TODO
* @author Liu
* @date 2018年6月1日 下午9:30:37
*/
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ctx.getBean(Car.class));
ctx.close();
}
}
Car's constructor...
Car's setBrand()...
----------------postProcessBeforeInitialization--------------Car [brand=Audi],car
Car's init()...
----------------postProcessAfterInitialization--------------Car [brand=Audi],car
Car [brand=Ford]
Car's destroy()...