Spring BeanPostProcessor 究竟是如何工作的?
How exactly does the Spring BeanPostProcessor work?
我正在学习 Spring 核心认证,我对 Spring 如何处理 beans 生命周期 有一些疑问,特别是 bean post 处理器.
所以我有这个架构:
我很清楚这意味着什么:
以下步骤发生在 加载 Bean 定义 阶段:
@Configuration类处理and/or@Components
扫描 and/or XML 个文件 已解析。
添加到 BeanFactory 的 Bean 定义(每个都在其 id 下索引)
Special BeanFactoryPostProcessor bean调用,它可以修改任何bean的定义(例如对于属性-占位符值替换)。
然后在beans创建阶段进行以下步骤:
默认情况下每个 bean 都被热切地实例化(以正确的顺序创建并注入其依赖项)。
依赖注入后,每个 bean 都经过 post 处理
可能会发生进一步配置和初始化的阶段。
在 post 处理之后,bean 已完全初始化并准备好使用(通过其 id 跟踪,直到上下文被销毁)
好的,这对我来说很清楚,我也知道 有两种类型的 bean post 处理器 是:
Initializers: 根据指示初始化 bean(即 @PostConstruct)。
和所有其余的:允许额外的配置并且可能运行在初始化步骤之前或之后
我 post 这张幻灯片:
所以我很清楚 initializers bean post 处理器是做什么的(它们是用 @[=128= 注释的方法]Contruct 注释并且在 setter 方法之后立即自动调用(因此在依赖注入之后),我知道我可以用来执行一些初始化批处理(如填充缓存前面的例子)。
但是另一个 bean post 处理器究竟代表什么?当我们说这些步骤在初始化阶段之前或之后执行时,我们是什么意思?
所以我的 bean 被实例化并且它的依赖项被注入,然后初始化阶段完成(通过执行 @PostContruct 注释方法)。我们说在初始化阶段之前使用 Bean Post 处理器是什么意思?这意味着它发生在 @PostContruct 注释方法执行之前?这是否意味着它可能发生在依赖注入之前(在调用 setter 方法之前)?
当我们说它在初始化步骤之后执行时,我们到底是什么意思?这意味着它发生在执行 @PostContruct 注释方法之后,或者什么?
我很容易理解为什么我需要一个 @PostContruct 注释方法,但我想不出另一种 bean 的一些典型示例post处理器,你能告诉我一些典型的例子吗?
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 打印出 class 和 bean 名称。
要了解该方法如何适应 bean 的生命周期,以及何时调用该方法,请检查 docs
postProcessBeforeInitialization(Object bean, String beanName) Apply
this BeanPostProcessor to the given new bean instance before any bean
initialization callbacks (like InitializingBean's afterPropertiesSet
or a custom init-method).
postProcessAfterInitialization(Object bean, String beanName) Apply
this BeanPostProcessor to the given new bean instance after any bean
initialization callbacks (like InitializingBean's afterPropertiesSet
or a custom init-method).
重要的一点还在于
The bean will already be populated with property values.
关于与 @PostConstruct
的关系请注意,此注释是声明 postProcessAfterInitialization
方法的一种便捷方式,当您通过注册时 Spring 会意识到它CommonAnnotationBeanPostProcessor
或在 bean 配置文件中指定 <context:annotation-config />
。 @PostConstruct
方法是在任何其他 postProcessAfterInitialization
之前还是之后执行取决于 order
属性
You can configure multiple BeanPostProcessor instances, and you can
control the order in which these BeanPostProcessors execute by setting
the order property.
bean post 处理器的典型示例是当您想要将原始 bean 包装在代理实例中时,例如使用 @Transactional
注释时。
bean post 处理器将被交给 bean 的原始实例,它可以调用目标上的任何方法,但它也会 return 应该绑定的实际 bean 实例在应用程序上下文中,这意味着它实际上可以 return 它想要的任何对象。这很有用的典型场景是当 bean post 处理器将目标包装在代理实例中时。在应用程序上下文中绑定的 bean 上的所有调用都将通过代理,然后代理在目标 bean 上的调用之后 and/or 之前执行一些魔术,例如AOP 或事务管理。
不同之处在于 BeanPostProcessor
将挂接到上下文初始化,然后为所有定义的 bean 调用 postProcessBeforeInitialization
和 postProcessAfterInitialization
。
但是 @PostConstruct
仅用于特定的 class 您想要在构造函数或 set 方法之后自定义 bean 创建。
我正在学习 Spring 核心认证,我对 Spring 如何处理 beans 生命周期 有一些疑问,特别是 bean post 处理器.
所以我有这个架构:
我很清楚这意味着什么:
以下步骤发生在 加载 Bean 定义 阶段:
@Configuration类处理and/or@Components 扫描 and/or XML 个文件 已解析。
添加到 BeanFactory 的 Bean 定义(每个都在其 id 下索引)
Special BeanFactoryPostProcessor bean调用,它可以修改任何bean的定义(例如对于属性-占位符值替换)。
然后在beans创建阶段进行以下步骤:
默认情况下每个 bean 都被热切地实例化(以正确的顺序创建并注入其依赖项)。
依赖注入后,每个 bean 都经过 post 处理 可能会发生进一步配置和初始化的阶段。
在 post 处理之后,bean 已完全初始化并准备好使用(通过其 id 跟踪,直到上下文被销毁)
好的,这对我来说很清楚,我也知道 有两种类型的 bean post 处理器 是:
Initializers: 根据指示初始化 bean(即 @PostConstruct)。
和所有其余的:允许额外的配置并且可能运行在初始化步骤之前或之后
我 post 这张幻灯片:
所以我很清楚 initializers bean post 处理器是做什么的(它们是用 @[=128= 注释的方法]Contruct 注释并且在 setter 方法之后立即自动调用(因此在依赖注入之后),我知道我可以用来执行一些初始化批处理(如填充缓存前面的例子)。
但是另一个 bean post 处理器究竟代表什么?当我们说这些步骤在初始化阶段之前或之后执行时,我们是什么意思?
所以我的 bean 被实例化并且它的依赖项被注入,然后初始化阶段完成(通过执行 @PostContruct 注释方法)。我们说在初始化阶段之前使用 Bean Post 处理器是什么意思?这意味着它发生在 @PostContruct 注释方法执行之前?这是否意味着它可能发生在依赖注入之前(在调用 setter 方法之前)?
当我们说它在初始化步骤之后执行时,我们到底是什么意思?这意味着它发生在执行 @PostContruct 注释方法之后,或者什么?
我很容易理解为什么我需要一个 @PostContruct 注释方法,但我想不出另一种 bean 的一些典型示例post处理器,你能告诉我一些典型的例子吗?
Spring 文档解释了 Customizing beans using BeanPostProcessor 下的 BPP。 BPP bean 是一种特殊的 bean,它在任何其他 bean 之前创建并与新创建的 bean 交互。使用此构造,Spring 使您可以通过自己实现 BeanPostProcessor
来连接和自定义生命周期行为。
拥有像
这样的自定义 BPPpublic 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 打印出 class 和 bean 名称。
要了解该方法如何适应 bean 的生命周期,以及何时调用该方法,请检查 docs
postProcessBeforeInitialization(Object bean, String beanName) Apply this BeanPostProcessor to the given new bean instance before any bean initialization callbacks (like InitializingBean's afterPropertiesSet or a custom init-method).
postProcessAfterInitialization(Object bean, String beanName) Apply this BeanPostProcessor to the given new bean instance after any bean initialization callbacks (like InitializingBean's afterPropertiesSet or a custom init-method).
重要的一点还在于
The bean will already be populated with property values.
关于与 @PostConstruct
的关系请注意,此注释是声明 postProcessAfterInitialization
方法的一种便捷方式,当您通过注册时 Spring 会意识到它CommonAnnotationBeanPostProcessor
或在 bean 配置文件中指定 <context:annotation-config />
。 @PostConstruct
方法是在任何其他 postProcessAfterInitialization
之前还是之后执行取决于 order
属性
You can configure multiple BeanPostProcessor instances, and you can control the order in which these BeanPostProcessors execute by setting the order property.
bean post 处理器的典型示例是当您想要将原始 bean 包装在代理实例中时,例如使用 @Transactional
注释时。
bean post 处理器将被交给 bean 的原始实例,它可以调用目标上的任何方法,但它也会 return 应该绑定的实际 bean 实例在应用程序上下文中,这意味着它实际上可以 return 它想要的任何对象。这很有用的典型场景是当 bean post 处理器将目标包装在代理实例中时。在应用程序上下文中绑定的 bean 上的所有调用都将通过代理,然后代理在目标 bean 上的调用之后 and/or 之前执行一些魔术,例如AOP 或事务管理。
不同之处在于 BeanPostProcessor
将挂接到上下文初始化,然后为所有定义的 bean 调用 postProcessBeforeInitialization
和 postProcessAfterInitialization
。
但是 @PostConstruct
仅用于特定的 class 您想要在构造函数或 set 方法之后自定义 bean 创建。