spring加载流程refresh之registerBeanPostProcessors(beanFactory)

缘起: 继spring执行了BeanFactoryPostProcessorspring加载流程refresh之invokeBeanFactoryPostProcessors(beanFactory),接下来就是注册BeanPostProcessor

注册BeanPostProcessor

/**
 * 注册BeanPostProcessor
 * 自定义以及spring内部的
 */
registerBeanPostProcessors(beanFactory);

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

获取容器中bd类型为BeanPostProcessor的bdName

String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

先来看一下这里的postProcessorNames
在这里插入图片描述

spring默认的3个类型为BeanPostProcessor的bd

默认情况下应该只有三个,是在初始化AnnotatedBeanDefinitionReader时注册的spring加载流程之AnnotatedBeanDefinitionReader

  • AutowiredAnnotationBeanPostProcessor
  • RequiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor

自定义的类型为BeanPostProcessor的bd

1. 可以自定义bd(需要添加元注解,能够被扫描注册进容器)实现BeanPostProcessor接口,这时候postProcessorNames就会出现自定义bd的beanName
2. 通过@Enable注解导入,例如我在测试aop时用到了@EnableAspectJAutoProxy@EnableAsync注解,spring就会注册截图中出现的两个额外的bd

定义BeanPostProcessor的个数

类型BeanPostProcessor的bd的数量 + 已经注册BeanPostProcessor数量 + 1

int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;

获取已经注册的BeanPostProcessor个数

beanFactory.getBeanPostProcessorCount() 

这里的BeanPostProcessor是通过执行beanFactory.addBeanPostProcessor(bpp)添加到
List<BeanPostProcessor> beanPostProcessors = new ArrayList();中去的
在这里插入图片描述
debugger可知,此时beanPostProcessors里面有3个,这是spring默认的,那么何时添加进去的呢?

spring默认添加的BeanPostProcessor

1. 执行spring加载流程refresh之prepareBeanFactory(beanFactory)时添加了两个后置处理器,ApplicationContextAwareProcessorApplicationListenerDetector
2. 还有一个是在实行spring加载流程refresh之invokeBeanFactoryPostProcessors(beanFactory)添加的

/**
 * 前面执行的是BeanFactoryPostProcessor的子类BeanDefinitionRegistryPostProcessor的回调
 * 现在执行BeanFactoryPostProcessor的回调
 */
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

执行ConfigurationClassPostProcessor.postProcessBeanFactory

private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors,ConfigurableListableBeanFactory beanFactory) 
{
   Iterator var2 = postProcessors.iterator();

   while(var2.hasNext()) {
       BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var2.next();
       postProcessor.postProcessBeanFactory(beanFactory);
   }
}

添加ImportAwareBeanPostProcessor后置处理器

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    int factoryId = System.identityHashCode(beanFactory);
    if (this.factoriesPostProcessed.contains(factoryId)) {
        throw new IllegalStateException("postProcessBeanFactory already called on this post-processor against " + beanFactory);
    } else {
        this.factoriesPostProcessed.add(factoryId);
        if (!this.registriesPostProcessed.contains(factoryId)) {
            this.processConfigBeanDefinitions((BeanDefinitionRegistry)beanFactory);
        }

        this.enhanceConfigurationClasses(beanFactory);
        // 添加后置处理器
        beanFactory.addBeanPostProcessor(new ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor(beanFactory));
    }
}
自定义添加的BeanPostProcessor

可以通过自定义bd(不需要被注册进容器)实现BeanPostProcessor接口,然后

  1. 自定义一个BFPP,将BPP添加进去
@Component
public class ServiceImpl implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        configurableListableBeanFactory.addBeanPostProcessor("bpp");
    }
}
  1. 或者
public static void main(String[] args){
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
     //context.publishEvent(new MyEvent(new Object()));
     context.register(AppConfig.class);
     // 获取beanFactory
     ConfigurableListableBeanFactory factory = context.getBeanFactory();
     // 添加BPP
     factory.addBeanPostProcessor(bpp);
     context.refresh();
}

注册BeanPostProcessorChecker

这也是个BPP,猜测用来校验bd是否有BPP处理,初始化beanPostProcessorTargetCount,其中之前的 1 就是它自己

排序/注册

这里根据bdName获取bd,然后排序(如果实现了排序接口),再就是注册进beanPostProcessors

List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList();
List<BeanPostProcessor> internalPostProcessors = new ArrayList();
List<String> orderedPostProcessorNames = new ArrayList();
List<String> nonOrderedPostProcessorNames = new ArrayList();
String[] var8 = postProcessorNames;
int var9 = postProcessorNames.length;

String ppName;
BeanPostProcessor pp;
for(int var10 = 0; var10 < var9; ++var10) {
    ppName = var8[var10];
    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
        priorityOrderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
        orderedPostProcessorNames.add(ppName);
    } else {
        nonOrderedPostProcessorNames.add(ppName);
    }
}

sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList();
Iterator var14 = orderedPostProcessorNames.iterator();

while(var14.hasNext()) {
    String ppName = (String)var14.next();
    BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
    orderedPostProcessors.add(pp);
    if (pp instanceof MergedBeanDefinitionPostProcessor) {
        internalPostProcessors.add(pp);
    }
}

sortPostProcessors(beanFactory, orderedPostProcessors);
registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList();
Iterator var17 = nonOrderedPostProcessorNames.iterator();

while(var17.hasNext()) {
    ppName = (String)var17.next();
    pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
    nonOrderedPostProcessors.add(pp);
    if (pp instanceof MergedBeanDefinitionPostProcessor) {
        internalPostProcessors.add(pp);
    }
}

registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors);
sortPostProcessors(beanFactory, internalPostProcessors);
registerBeanPostProcessors(beanFactory, (List)internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值