gpt4 book ai didi

java - BeanPostProcessor 混淆

转载 作者:IT老高 更新时间:2023-10-28 13:48:00 24 4
gpt4 key购买 nike

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

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

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

你应该在你想要的 bean 上实现这个接口(interface),还是应该在一个对许多 bean 通用的 bean 上使用这个接口(interface)?我看到你得到了传入的对象和字符串参数。

Sometimes, you may find yourself in a position where you need to performsome additional processing immediately before and after Spring instantiates the bean. The processing can be as simple as modifying the bean or as complex as returning a completely different object! The BeanPostProcessor interface has two methods: postProcessBeforeInitialization, which is called before Spring calls any bean initialization hooks (such as InitializingBean.afterPropertiesSet or the init-method), and postProcessAfterInitialization, which Spring calls after the initialization hooks succeed.

Pro Spring 2.5,第 118 页

最佳答案

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

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

乍一看,它可能看起来很复杂而且难以承受,但是当您在 Spring 之上构建复杂的应用程序时,所有这些功能都是无价的。

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

  • AutowiredAnnotationBeanPostProcessor - 扫描 bean 寻找@Autowire 注释以执行依赖注入(inject)
  • RequiredAnnotationBeanPostProcessor - 检查所有依赖项标记为 @Required 已被注入(inject)。
  • ServletContextAwareProcessor - 将 ServletContext 注入(inject)到 beans实现ServletContextAware接口(interface)
  • 实际上,JSR-250 @PostConstruct@PreDestroy 等初始化/销毁回调是使用后处理器实现的:CommonAnnotationBeanPostProcessor

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

关于java - BeanPostProcessor 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com