我试图理解 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初始化过程:
@PostConstruct
, afterPropertiesSet()
(定义为InitializingBean
回调接口),自定义配置init
method
-
postProcessAfterInitialization(Object bean, String beanName)
叫做
乍一看,它可能看起来很复杂和令人难以承受,但是当您在 Spring 之上构建复杂的应用程序时,所有这些功能都是无价的。
可能的场景例如(取自 Spring 本身):
-
AutowiredAnnotationBeanPostProcessor
- 扫描bean寻找@Autowire
注解以执行依赖注入
-
RequiredAnnotationBeanPostProcessor
- 检查是否所有依赖项
标记为@Required
已被注射。
-
ServletContextAwareProcessor
- 注入ServletContext
到豆子
实施ServletContextAware
界面
- 实际上,初始化/销毁回调,例如 JSR-250
@PostConstruct
and @PreDestroy
使用后处理器实现:CommonAnnotationBeanPostProcessor
当然,所有提到的后处理器必须以特定的顺序执行,但这是 Spring 的责任来确保这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)