BeanFactoryPostProcessor 为spring在容器初始化时对外对外暴露的扩展点,Spring IoC容器允许BeanFactoryPostProcessor在容器加载注册BeanDefinition完成之后读取BeanDefinition(配置元数据),并可以修改它。
@FunctionalInterface public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException; }自定义的BeanFactoryPostProcessor子类,可以在实例化Bean之前对BeanDefinition(配置元数据)进行修改.
@Configuration @ComponentScan(value = {"com.lb.spring.day7.part20"}) public class MyConfigration20 { @Bean public Moon moon(){ return new Moon(); } } @Component public class LbBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { System.out.println("------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------"); int beanCount = configurableListableBeanFactory.getBeanDefinitionCount(); System.out.println("获取到Bean的数量为:"+beanCount); for (String name : configurableListableBeanFactory.getBeanDefinitionNames()){ System.out.println(name); } System.out.println("----------------------------------------------------------------------------------"); } }启动项目:
由一下日志可以发现执行postProcessBeanFactory方法时,Spring已经可以获得所有BeanDefinition(Bean的相关定义信息,并且Bean还没有实例化注入到容器),可以对任何Bean的BeanDefinition信息进行修改。
Moon constructor.....为自定义类的构造方法日志.则可以说明postProcessBeanFactory方法实在Bean实例化之前执行的。
------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------ 获取到Bean的数量为:9 org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalRequiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory myConfigration20 lbBeanFactoryPostProcessor moon ---------------------------------------------------------------------------------- 九月 04, 2020 4:24:02 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring Moon constructor.....可以发现BeanDefinitionRegistryPostProcessor为BeanFactoryPostProcessor的子类,也具有修改BeanDefinition的功能,并且提供了可以向IOC容器中注册之前Bean的功能
@Component public class LbBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { System.out.println("------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()------------------"); int beanCount = beanDefinitionRegistry.getBeanDefinitionCount(); System.out.println("获取到Bean的数量为:"+beanCount); RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Moon.class); beanDefinitionRegistry.registerBeanDefinition("small_moon",rootBeanDefinition); System.out.println("----------------------------------------------------------------------------------"); } public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { System.out.println("------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanFactory()------------------"); int beanCount = configurableListableBeanFactory.getBeanDefinitionCount(); System.out.println("获取到Bean的数量为:"+beanCount); System.out.println("----------------------------------------------------------------------------------"); } }启动项目:
由日志可以发现BeanDefinitionRegistryPostProcessor的子类执行顺序在BeanFactoryPostProcessor子类之前,并且先执行postProcessBeanDefinitionRegistry()方法后执行postProcessBeanFactory()方法
------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()------------------ 获取到Bean的数量为:10 向Spring容器中添加id为small_moon的Moon对象 ---------------------------------------------------------------------------------- ------------LbBeanDefinitionRegistryPostProcessor.postProcessBeanFactory()------------------ 获取到Bean的数量为:11 ---------------------------------------------------------------------------------- ------------LbBeanFactoryPostProcessor.postProcessBeanFactory()------------------ 获取到Bean的数量为:11 org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalRequiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory myConfigration20 lbBeanDefinitionRegistryPostProcessor lbBeanFactoryPostProcessor moon small_moon ---------------------------------------------------------------------------------- 九月 04, 2020 4:33:11 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring Moon constructor..... Moon constructor.....为什么BeanDefinitionRegistryPostProcessor在BeanFactoryPostProcessor之前执行呢?
通过查看源码
BeanFactoryPostProcessor的执行顺序为:
执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanDefinitionRegistry()方法执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanFactory()方法执行继承PriorityOrdered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法执行继承Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法执行没有继承PriorityOrdered和Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法
