BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
1、BeanFactoryPostProcessor:beanFactory的后置处理器;
在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
一、BeanFactoryPostProcessor原理:
创建自定义的BeanFactoryPostProcessor,断点到方法上,查看执行的流程
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("MyBeanFactoryPostProcessor....."); String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames(); for (int i = 0; i <beanDefinitionNames.length ; i++) { System.out.println("bean:"+beanDefinitionNames[i]); } } }
1)、ioc容器创建对象
2)、invokeBeanFactoryPostProcessors(beanFactory);
如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
2)、在初始化创建其他组件前面执行
二、 BeanDefinitionRegistryPostProcessor 原理
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor postProcessBeanDefinitionRegistry();
在所有bean定义信息将要被加载,bean实例还未创建的;在BeanFactoryPostProcessor接口方法之前执行
创建自定义的BeanDefinitionRegistryPostProcessor 查看执行过程
import com.willow.bean.Color; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.stereotype.Component; public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { //在postProcessBeanDefinitionRegistry() 之后执行 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("postProcessBeanFactory...bean的数量:"+beanFactory.getBeanDefinitionCount()); }