• bazinga
    2020-08-23
    楼上小哥好,前面处理的是当前上下文的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,以及beanFactory的BeanDefinitionRegistryPostProcessor,漏掉了beanFactory的BeanFactoryPostProcessor,所以后面的逻辑是就是处理漏掉的部分。所以总结下来,spring在处理BeanFactoryPostProcessor的逻辑是: 1. 处理当前上下文的BeanDefinitionRegistryPostProcessor;2.处理beanFactory中的BeanDefinitionRegistryPostProcessor;3. 处理当前上下文的BeanFactoryPostProcessor;4. 处理beanFactory中的BeanFactoryPostProcessor。

    作者回复: 666

    共 6 条评论
    8
  • James
    2020-11-28
    666.评论太棒了. 第二种方法.AbstractApplicationContext#invokeBeanFactoryPostProcessors -一部分当前应用上下文所关联的,另一部分是当前上下文所关联的BeanFactory注册的BeanDefinition Bean对象 也就是一部分来源框架自定义,一部分来源开发者自定义 -- 1. 处理当前上下文的BeanDefinitionRegistryPostProcessor-框架内部 2. 处理beanFactory中的BeanDefinitionRegistryPostProcessor-开发者自定义,优先处理@PriorityOrdered,@Ordered,常规顺序 3. 处理当前上下文的BeanFactoryPostProcessor 4. 处理beanFactory中的BeanFactoryPostProcessor-if else后完成处理

    作者回复: 高手在民间

    
    6
  • fullmoon
    2021-01-11
    总结: AbstractApplicationContext#postProcessBeanFactory(ConfigurableListableBeanFactory) 方法,交由子类实现,例如 AbstractRefreshableApplicationContext 的实现中会添加 ServletContext 相关内容 AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) 方法,主要是执行 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor 的处理,会做以下事情: 1. 如果当前 Spring 应用上下文是 BeanDefinitionRegistry 类型,则执行当前 Spring 应用上下文中所有 BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor 的处理,以及底层 BeanFactory 容器中 BeanDefinitionRegistryPostProcessor 的处理,处理顺序如下: 1. 当前 Spring 应用上下文中所有 BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry 2. 底层 BeanFactory 容器中所有 BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(优先级:PriorityOrdered > Ordered > 无) 3. 当前 Spring 应用上下文和底层 BeanFactory 容器中所有 BeanDefinitionRegistryPostProcessor#postProcessBeanFactory 4. 当前 Spring 应用上下文中所有 BeanFactoryPostProcessor#postProcessBeanFactory 2. 否则,执行当前 Spring 应用上下文中所有 BeanFactoryPostProcessor#postProcessBeanFactory 3. 执行底层 BeanFactory 容器中所有 BeanFactoryPostProcessor#postProcessBeanFactory,上面已经处理过的会跳过,执行顺序和上面一样:PriorityOrdered > Ordered > 无
    展开

    作者回复: 学习课代表~

    
    5
  • 地平线
    2021-02-18
    结合小马哥的讲解和评论区的一些总结,自己再记录一下: 1.处理当前上下文的BeanDefinitionRegistryPostProcessor,执行postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法。 2.处理beanFactory中的BeanDefinitionRegistryPostProcessor-开发者实现了BeanDefinitionRegistryPostProcessor接口的实现类,如果有多个实现类,按照@PriorityOrdered,@Ordered,顺序执行 postProcessBeanDefinitionRegistry 方法。 3.处理当前上下文中的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,执行 postProcessBeanFactory 方法。 4.处理beanFactory中的BeanFactoryPostProcessor-开发者实现了BeanDefinitionRegistryPostProcessor 或者 BeanFactoryPostProcessor 的实现类,执行 postProcessBeanFactory 方法。
    展开

    作者回复: 666

    
    1
  • 惘 闻
    2020-12-04
    方法参数beanFactoryPostProcessors是当前上下文AbstractApplicationContext全部的BeanFactoryPostProcessor; 参数beanFactory是当前上下文容器,此容器可以关联其他容器,可以通过依赖查找获取其他关联的容器中的BeanFactoryPostProcessor. 所以通过beanFactoryPostProcessors的处理会处理当前容器中的BeanFactoryPostProcessor; 而通过beanFactory进行依赖查找后过滤后就是其他关联容器中的BeanFactoryPostProcessor. 奥利给!

    作者回复: 学习课代表~

    
    1
  • 梦想吊打面试官的小小...
    2021-09-05
    马老师,最后普通的获取容器中的BeanFactoryPostProcessor为什么没有进行类似的递归处理,只是处理一遍就结束了,如果在#postProcessBeanFactory方法中再注册了一个BeanFactoryPostProcessor的话,那样不是处理不到了吗? 难道说Spring有约定只能在BeanDefinitionRegistryPostProcessor接口的实现里注册Bean吗?

    作者回复: 你说的情况的确存在

    
    
  • 梦想吊打面试官的小小...
    2021-09-05
    组合一般优先继承,这一段的解释我觉得我和小马哥跨越时空产生了灵魂的沟通

    作者回复: 👍

    
    
  • Geek3340
    2021-08-28
    if (beanFactory instanceof BeanDefinitionRegistry) { …… }else{ invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } //后面部分的逻辑处理谈一下我的理解,当beanfactory不是BeanDefinitionRegistry时,它仅仅执行了前面else里面的 invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);即只执行了当前上下文中的beanFactoryPostProcessors的处理逻辑,没有执行底层beanfactory注册的beanFactoryPostProcessors处理逻辑。这正是漏掉的处理逻辑。 如果当beanfactory是BeanDefinitionRegistry时,其实没有漏掉底层beanfactory的beanFactoryPostProcessors.postProcessBeanFactory()处理逻辑。 所以这部分代码是不是放入到else里面更好? 这只是个人理解,没有debug细看,希望各位大佬指正。
    展开

    作者回复: 6

    
    
  • 吴月月鸟
    2021-02-03
    PostProcessorRegistrationDelegate. invokeBeanFactoryPostProcessors():先处理 applicationContext.addBeanFactoryPostProcessor(BeanFactoryPostProcessor) 产生的 BeanFactoryPostProcessor;再处理 BeanDefinition 中定义的实现 BeanDefinitionRegistryPostProcessor 的类,每次处理前都需要 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); 是因为前面的 BeanDefinitionRegistryPostProcessor 类可能产生新的 BeanDefinitionRegistryPostProcessor 类;可以在 PriorityOrdered.class 中可以 实现生成了 Order.class 的Processor,可正常执行,如果在PriorityOrdered.class 产生 实现了 PriorityOrdered.class 因为无法查询到导致无法被执行。所以最后有一个迭代操作保证每个 BeanDefinitionRegistryPostProcessor 都会被执行,但执行顺序可能会出现 PriorityOrdered.class 在 Ordered.class 后执行的情况。
    展开

    作者回复: 666

    
    
  • study的程序员
    2021-01-16
    没有递归处理BeanFactoryPostProcessor,还是会有漏掉的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的beanDefinition吧?

    作者回复: 是的,如果没有递归处理的话,你说的内容都会发生

    
    