BeanPostProcessor的使用
1、Bean的后置处理器,用于初始化前后进行调用,某个Bean去初始化的时候,会自动扫描所有的BeanPostProcessor,然后去执行下面的方法
2、自定义某个后置处理器,去实现接口BeanPostProcess,然后重写里面的方法
(1)public Object postProcessorBeforeInitialization(Object bean,String beanName):
(2)public Object postProcessorAfterInitialization(Object bean,String beanName):
BeanPostProcessor的原理
1、大体过程
(1)创建IOC容器,AnnotationConfigApplicationContext的构造器里面调用refresh()方法,然后调用finishBeanFactoryInitialization()方法,初始化所有的单实例对象
(2)在finishBeanFactoryInitialization()的方法里面,会进行createBean(),然后再调用doCreateBean(),代码里面先会给属性赋值,调用方法populateBean()进行属性赋值,才会执行下面的代码initializeBean()方法
(3)initializeBean()是真正的初始化的方法,里面有后置处理器逻辑,首先执行后置处理器的Before方法,然后执行invokeInitMethods(),这个方法是真正执行初始化的方法,比如Bean指定init-methods方法、实现接口InitializingBean等
(4)在执行invokeInitMethods()方法之前,是后置处理器的before处理逻辑,也就是applyBeanPostProcessorsBeforeInitialization(),方法之后是执行applyBeanPostProcessorsAfterInitialization()
(5)applyBeanPostProcessorsBeforeInitialization():获取到所有的BeanPostProcessor,挨个执行beforeInitialization(),一旦返回null,就跳出for循环,不会执行后面的BeanPostProcessor
(6)applyBeanPostProcessorsAfterInitialization():获取到所有的BeanPostProcessor,挨个执行afterInitialization(),一旦返回null,就跳出for循环,不会执行后面的BeanPostProcessor
Spring底层对BeanPostProcessor的使用
1、一个Bean中注入IOC容器
(1)这个Bean去实现接口ApplicationContextAware接口,重写里面的setApplicationContext()方法,在Bean里面创建一个变量,去接收ApplicationContextAwareProcessor设置的IOC容器
(2)ApplicationContextAwareProcessor这个是实现了BeanPostProcessor接口的类,里面的postProcessorBeforeInitialization(Object bean,String beanName),会进行判断这个Bean有没有实现相应的Aware接口,然后才会set一个IOC容器
2、Bean里面注解的原理(以@BeanConstruct和@PreDestroy)
(1)Spring里面有一个BeanPostProcessor是专门管理声明周期注解的,叫InitDestroyAnnotationBeanPostProcessor,里面postProcessorBeforeInitialization(Object bean,String beanName)方法会调用findLifecycleMetadata()方法,里面有相关的注解标注的方法,通过反射的方式去调用相应的方法
3、总结
(1)Bean的赋值,其他组件的注入,@Autowired,生命周期注解功能,@Async等等,都是依靠BeanPostProcessor弄成的