在之前我们看bean的生命周期时,有如下过程。
在实例化前后,有InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation和InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation两个动作。
InstantiationAwareBeanPostProcessor作用:它继承于BeanPostProcessor,2个接口十分相似,只是执行的阶段不同。
在bean的初始化前后,有BeanPostProcessor.postProcessBeforeInitialization和BeanPostProcessor.postProcessAfterInitialization2个动作。
BeanPostProcessor作用:在bean的初始化前后,添加自己的一些处理逻辑。例如改变bean的属性等,如下。
// xml配置
<bean id="person" class="beanPostProcessor.chapter1.Person">
<property name="name" value="Hi"></property>
</bean>
// Java代码
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\beanPostProcessor\\chapter1\\person.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getName());
}
// 结果
打印了 HaHa
如何是打印了HaHa,而不是Hi。
因为注册了一个BeanPostProcessor,来修改初始化前后bean的属性。
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization:: "+beanName);
if("person".equals(beanName)) {
Class clazz = bean.getClass();
try {
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(bean, "HaHa");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization:: "+beanName);
return bean;
}
}