Spring BeanFactoryPostProcessors

BeanFactoryPostProcessors

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

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}

可以发现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执行顺序

为什么BeanDefinitionRegistryPostProcessor在BeanFactoryPostProcessor之前执行呢?

通过查看源码

BeanFactoryPostProcessor的执行顺序为:

  1. 执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanDefinitionRegistry()方法
  2. 执行所有类型为BeanDefinitionRegistry的BeanFactoryPostProcessor.postProcessBeanFactory()方法
  3. 执行继承PriorityOrdered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法
  4. 执行继承Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法
  5. 执行没有继承PriorityOrdered和Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory()方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值