前提说明:
上一篇提到的,BeanPostProcessor两个方法其实就是分别在init、afterProperties方法前后执行。
而spirng内部定义了几个BeanPostProcessor,如下图。这里我用ApplicationContextAwareProcessor来说明processor在spring底层的使用。
测试代码:
package com.lei.study_09_16.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * * * @author LeiLei * @date 2019/9/16 */ public class Dog implements ApplicationContextAware { ApplicationContext context; public Dog() { System.out.println("Dog.Dog"); System.out.println("context21111111111111111111111111111111111111:"+context); } public void init() { System.out.println("Dog.init"); System.out.println("context23333333333333333333333333333333333333333333:"+context); } public void destory() { System.out.println("Dog.destory"); System.out.println("context244444444444444444444444444444444444444444444:"+context); } /** * 实现的ApplicationContextAware的方法,获取到IOC容器 * * @param applicationContext IOC * @throws BeansException */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { context = applicationContext; } }
@Test public void BeanPostProcessor() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(com.lei.study_09_16.config.BeanConfig.class); System.out.println("容器初始化完成。。。"); Dog bean = context.getBean(Dog.class); System.out.println(bean); context.close(); }
测试结果:
Dog.Dog
context21111111111111111111111111111111111111:null
dog:MyBeanPostProcessor.postProcessBeforeInitialization123123
Dog.init
context23333333333333333333333333333333333333333333:org.springframework.context.annotation.AnnotationConfigApplic
dog:MyBeanPostProcessor.postProcessAfterInitialization123132
容器初始化完成。。。
Dog.destory
context244444444444444444444444444444444444444444444:org.springframework.context.annotation.AnnotationConfigAppli
因为是在init方法前执行,在创建对象和注入值之后执行postProcessBeforeInitialization123123,因此构造器中还没有对IOC赋值,拿到的为null。
总结:
1.BeanPostProcessor两个方法在init方法前后执行。
2.postProcessBeforeInitialization方法中对实现ApplicationContextAware接口做了判断,如果实现了该接口则调用该接口的方法,从而达到在Dog中注入IOC容器对象。