本章节重点说一下我们自定义的BeanPostProcessor的执行机制和调用栈。
事前准备:
1.自定义beanPostProcessor
2.注册自定义的beanPostProcessor到容器中
1.自定义beanPostProcessor
@Component
public class LifeCycleBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Toyota) {
System.err.println("postProcessBeforeInitialization....拦截指定bean");
}
System.out.println("这句话证明所有容器中的bean都会被postProcessBeforeInitialization拦截.. beanName=" + beanName + "==>" + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Toyota) {
System.err.println("postProcessAfterInitialization.....拦截指定bean");
}
System.out.println("这句话证明所有容器中的bean都会被postProcessAfterInitialization拦截.. beanName=" + beanName + "==>" + bean);
return bean;
}
}
2.注册自定义的beanPostProcessor到容器中
@Configuration
@ComponentScan("com.ddc.fw.spring.annotation.demo.BeanPostProcessor") // 扫描自定义BeanPostProcessor
public class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "detory")
// @Scope("prototype")
public Toyota toyota() {
return new Toyota();
}
}
执行我们的测试代码:
@Test
public void testCar() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(LifeCycleConfig.class);
printBeans(context);
context.getBean("toyota");
context.close();
}
现在我们通过junit的方法看一下调用栈:
红色框内,便是执行到自定义的BeanPostProcessor的执行调用栈。
我们一步一步跟进去查看:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
第八步:
第九步:
第十步:
第十一步:
第十二步:
第十三步:
遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
BeanPostProcessor原理
populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}