gpt4 book ai didi

spring - Spring BeanPostProcessor 究竟是如何工作的?

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

我正在学习 Spring Core 认证,我对 Spring 如何处理 bean 生命周期,尤其是 bean 后处理器有一些疑问。

所以我有这个架构:

enter image description here

我很清楚这意味着什么:

以下步骤发生在加载 Bean 定义阶段:

  • @Configuration 类被处理和/或 @Components 被处理扫描和/或 XML 文件 被解析。

  • 添加到 BeanFactory 的 Bean 定义(每个都在其 id 下编入索引)

  • 调用特殊的BeanFactoryPostProcessor bean,它可以修改任何bean的定义(例如用于属性占位符值的替换)。

然后在beans创建阶段进行以下步骤:

  • 默认情况下,每个 bean 都被急切地实例化(以正确的顺序创建并注入(inject)其依赖项)。

  • 依赖注入(inject)后,每个 bean 都会经过一个后处理可能发生进一步配置和初始化的阶段。

  • 在后处理之后,bean 完全初始化并准备好使用(由其 id 跟踪,直到上下文被销毁)

好的,这对我来说很清楚,我也知道有两种类型的 bean 后处理器,它们是:

  • Initializers:根据指示初始化 bean(即@PostConstruct)。

  • 所有其余部分:允许进行额外配置并且可以在初始化步骤之前或之后运行

我张贴这张幻灯片:

enter image description here

所以我很清楚 initializers bean 后处理器有什么作用(它们是带有 @PostContruct 注释的方法,并且在 setter 之后立即自动调用方法(所以在依赖注入(inject)之后),并且我知道我可以使用它来执行一些初始化批处理(如在前面的示例中填充缓存)。

但究竟什么代表了另一个 bean 后处理器?当我们说这些步骤在初始化阶段之前或之后执行时,我们的意思是什么?

所以我的 bean 被实例化并注入(inject)了它的依赖项,因此初始化阶段完成(通过执行 @PostContruct 注释方法)。在初始化阶段之前使用 Bean 后处理器是什么意思?这意味着它发生在 @PostContruct 注释方法执行之前?这是否意味着它可能发生在依赖注入(inject)之前(在调用setter方法之前)?

当我们说它在初始化步骤之后执行时,我们的确切意思是什么。这意味着它发生在执行 @PostContruct 注释方法之后,还是什么?

我可以很容易地想到为什么我需要一个 @PostContruct 带注释的方法,但我想不出另一种 bean 后处理器的一些典型例子,你能给我一些典型的例子吗什么时候用的?

最佳答案

Spring 文档解释了 Customizing beans using BeanPostProcessor 下的 BPP . BPP bean 是一种特殊的 bean,它在任何其他 bean 之前创建并与新创建的 bean 交互。有了这个结构,Spring 为您提供了连接和自定义生命周期行为的方法,只需实现 BeanPostProcessor自己。

拥有像这样的自定义 BPP

public class CustomBeanPostProcessor implements BeanPostProcessor {

public CustomBeanPostProcessor() {
System.out.println("0. Spring calls constructor");
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(bean.getClass() + " " + beanName);
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(bean.getClass() + " " + beanName);
return bean;
}
}

将被调用并打印出每个创建的 bean 的类和 bean 名称。

要了解该方法如何适应 bean 的生命周期,以及该方法何时被调用,请查看 docs

postProcessBeforeInitialization(Object bean, String beanName) Applythis BeanPostProcessor to the given new bean instance before any beaninitialization callbacks (like InitializingBean's afterPropertiesSetor a custom init-method).

postProcessAfterInitialization(Object bean, String beanName) Applythis BeanPostProcessor to the given new bean instance after any beaninitialization callbacks (like InitializingBean's afterPropertiesSetor a custom init-method).

还有一点很重要

The bean will already be populated with property values.

关于与 @PostConstruct 的关系请注意,此注解是声明 postProcessAfterInitialization 的便捷方式。方法,当您通过注册 CommonAnnotationBeanPostProcessor 时,Spring 就会意识到它。或指定 <context:annotation-config />在 bean 配置文件中。是否@PostConstruct方法将在任何其他 postProcessAfterInitialization 之前或之后执行取决于 order属性

You can configure multiple BeanPostProcessor instances, and you cancontrol the order in which these BeanPostProcessors execute by settingthe order property.

关于spring - Spring BeanPostProcessor 究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29743320/

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