【spring系列】之7:生命周期-BeanPostProcessor原理以及在spring底层中的运用

本章节重点说一下我们自定义的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);
 }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值