BeanPostProcessor混淆

我试图在Spring中理解BeanPostProcessor,但我不明白它的作用。 BeanPostProcessor定义了在这些点调用的两个方法是否正确:

  • 在初始化之前(init方法或afterPropertiesSet),但是创建了实例。
  • 调用init方法或afterPropertiesSet方法之后

那是对的吗? 鉴于第118页的示例和文本,进一步令人困惑。 我不认为我可以将更多内容从文本复制到问题,但注释和发生的事情很难理解。

你是否应该在你想要的bean上实现这个接口,或者你应该在一个通用于许多bean的bean上使用它? 我看到你同时传递了对象和字符串参数。

有时,您可能会发现自己处于需要在Spring实例化bean之前和之后立即执行其他处理的位置。 处理可以像修改bean一样简单,也可以像返回完全不同的对象一样复杂! BeanPostProcessor接口有两个方法:postProcessBeforeInitialization,它在Spring调用任何bean初始化挂钩(例如InitializingBean.afterPropertiesSet或init方法)之前调用,而postProcessAfterInitialization则在Spring初始化挂钩成功之后调用。

Pro Spring 2.5,第118页

Spring为您提供了很多后处理器,而不仅仅是BeanPostProcessor 。 此外,它们中的大多数都是由Spring本身使用的。 您在此问题中提到的那个(在其实例化后)使用(如其名称所示)来发布进程bean。 Spring容器的行为如下:

  • Spring实例化bean调用其构造函数
  • 调用postProcessBeforeInitialization(Object bean, String beanName)
  • bean初始化过程: afterPropertiesSet()afterPropertiesSet() (由InitializingBean回调接口定义),自定义配置的init方法
  • 调用postProcessAfterInitialization(Object bean, String beanName)

乍一看,它可能看起来很复杂而且势不可挡,但是当你在Spring的顶层构建复杂的应用程序时,所有这些function都是非常宝贵的。

可能的场景,例如(取自Spring本身):

  • AutowiredAnnotationBeanPostProcessor – 扫描bean寻找@Autowire注释以执行dependency injection
  • RequiredAnnotationBeanPostProcessor – 检查是否已注入标记为@Required所有依赖项。
  • ServletContextAwareProcessor – 将ServletContext注入到实现ServletContextAware接口的bean中
  • 实际上,使用后处理器实现初始化/解构回调,例如JSR-250 @PostConstruct@PreDestroyCommonAnnotationBeanPostProcessor

当然,所有提到的后处理器必须按特定顺序执行,但这是Spring负责确保它。

实现BeanPostProcessor以构建一个服务,该服务在创建时应用于上下文中的所有bean。 JavaDocs显示了许多具体示例,但我一致使用的是AutowiredAnnotationBeanPostProcessor 。 这使用reflection来扫描bean类以获取字段和方法上的@Autowired注释。

 public class MyBean { @Autowired MyOtherBean otherBean; // assigned by AutowiredAnnotationBPP ... } 

在Spring之上构建自己的框架或跨多个bean的子集应用的function时,此工具最有用。 您更有可能使用Spring提供的现有bean后处理器。