BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清
  TEZNKK3IfmPf 2023年11月15日 15 0

最开始接触spring源码,被一堆的postProcessor搞晕了,翻译也不“包准”,有的翻译为【后置处理器】、有的翻译为【后置增强器】,这里姑且就翻译为处理器吧。

众所周知,在spring框架中,对象分两种,一种是普通bean,一种是容器本身,也就是BeanFactory,而通过两个接口的名字能很容易的识别。

BeanFactoryPostProcessor

BeanFactoryPostProcessor作为众多xxxBeanFactoryPostProcessor接口的父接口,它提供的功能就是处理与BeanFactory相关的内容

源码如下:

@FunctionalInterface
public interface BeanFactoryPostProcessor {

  /**
   * Modify the application context's internal bean factory after its standard
   * initialization. All bean definitions will have been loaded, but no beans
   * will have been instantiated yet. This allows for overriding or adding
   * properties even to eager-initializing beans.
   * @param beanFactory the bean factory used by the application context
   * @throws org.springframework.beans.BeansException in case of errors
   */
  void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

从源码可以得知,只要实现接口,你就能拿到beanFactroy对象,然后对beanFactory里面的信息进行“为所欲为”的修改

因为此时所有的bean的定义信息(definitions)都已经被加载进beanFactory里面了,你可以对他们的属性进行覆盖或者添加,甚至可以提前初始化都可以。

相比于BeanFactoryPostProcessor,只是修改BeanFactory里面的内容,BeanPostProcessor就丰富的多了,因为BeanFactoryPostProcessor发生的时机是BeanFactory创建之后,bean初始化之前,而BeanPostProcessor伴随整个bean的生命周期,实例化前、实例化后、初始化前、初始化后等等

BeanPostProcessor

BeanPostProcessor作为众多xxxBeanPostProcessor接口的父接口,它提供的功能就是处理与bean相关的内容。作为根接口,

它提供了两个基本的方法postProcessBeforeInitialization和postProcessAfterInitialization,分别对应bean的初始化前、初始化后,而BeanPostProcessor有一堆的子接口,常见的有:

InstantiationAwareBeanPostProcessor

SmartInstantiationAwareBeanPostProcessor

MergedBeanDefinitionPostProcessor

spring的自动注入、事务、aop等功能都是通过不同的BeanPostProcessor来实现的。

其类图如下所示

BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清

BeanFactoryPostProcessor执行时机

它的执行时机是创建容器之后的invokeBeanFactoryPostProcessors

BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清

BeanPostProcessor执行时机

不同的子类执行的具体时机不同,但都是在finishBeanFactoryInitialization的过程中。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   46   0   0 JSpspring
TEZNKK3IfmPf