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
和@PreDestroy
:CommonAnnotationBeanPostProcessor
当然,所有提到的后处理器必须按特定顺序执行,但这是Spring负责确保它。
实现BeanPostProcessor
以构建一个服务,该服务在创建时应用于上下文中的所有bean。 JavaDocs显示了许多具体示例,但我一致使用的是AutowiredAnnotationBeanPostProcessor
。 这使用reflection来扫描bean类以获取字段和方法上的@Autowired
注释。
public class MyBean { @Autowired MyOtherBean otherBean; // assigned by AutowiredAnnotationBPP ... }
在Spring之上构建自己的框架或跨多个bean的子集应用的function时,此工具最有用。 您更有可能使用Spring提供的现有bean后处理器。