Java Springbean创建生命周期:为什么有多个交互点?
我正在学习spring,我被bean生命周期困住了 当创建一个bean时,spring给了我们几个maner来与之交互。我们可以使用以下一种或全部:Java Springbean创建生命周期:为什么有多个交互点?,java,spring,Java,Spring,我正在学习spring,我被bean生命周期困住了 当创建一个bean时,spring给了我们几个maner来与之交互。我们可以使用以下一种或全部: BeanFactory后处理器 BeanPostProcessor#初始化前的后处理 @PostConstruct 初始化bean#AfterPropertieSet @Bean#initMethod BeanPostProcessor#后处理器初始化后 Spring按上述顺序调用它们 我的问题是:为什么所有这些互动点?什么时候使用它们(用例)?A
BeanFactory后处理器
BeanPostProcessor#初始化前的后处理
@PostConstruct
初始化bean#AfterPropertieSet
@Bean#initMethod
BeanPostProcessor#后处理器初始化后
Spring按上述顺序调用它们
我的问题是:为什么所有这些互动点?什么时候使用它们(用例)?A
BeanFactoryPostProcessor
和ABeanPostProcessor
是完全不同的beast,也适用于不同的事物
BeanFactoryPostProcessor
将对bean的元数据进行操作(我喜欢称之为recipe),并对其进行后期处理。一个众所周知的例子是propertysourcesplaceconfigurer
,它将用值注入/替换配置中的所有@Value
。BeanFactoryPostProcessor
在创建任何bean之前对元数据进行操作
BeanPostProcessor
可以应用于bean,甚至可以替换bean。SpringAOP经常使用这个。一个例子是PersistenceExceptionTranslationPostProcessor
,当一个bean被创建时,它将通过这个BeanPostProcessor
,当它被@Persistence
注释时,这个bean将被一个代理所取代。此代理添加异常转换(即,它将jpaeexception
和SQLException
转换为SpringDataAccessException
)。这是在BeanPostProcessor中完成的。并且可以在调用init回调之前完成(调用
postProcessBeforeInitialization或调用
postProcessAfterInitialization之后)。
PersistenceExceptionTranslationPostProcessor将在
postProcessAfterInitialization`中运行,因为它需要确保bean已经初始化
servletcontextawarecomprocessor
将在创建对象后立即运行,以便尽早注入ServletContext
,因为bean的初始化可能依赖于它
初始化bean的3个回调或多或少是相同的,但都是按顺序调用的,因为它们已包含在更高版本中。它只使用xml中的接口初始化Bean
和init方法
(后来还添加到@Bean
),并且在注释成为一种东西时添加了注释支持
您需要init方法来初始化bean,您可能需要检查是否已设置了所有属性(如所需的数据源),或者您可能需要启动一些东西。a数据源(尤其是连接池)这是一个很好的初始化示例。在注入所有依赖项后,您希望启动池,使其打开连接。现在,由于您可能无法修改代码,因此,如果您控制可能要添加的代码,请使用@PostConstruct
。如果您编写的框架依赖于Spring我将使用初始化bean
除了这3个init方法之外,还有销毁计数器部分。DisposableBean
接口(和destroy方法
)和@PreDestroy
注释。同样,当您停止应用程序时,您还希望关闭连接池中的连接,并且您可能希望调用数据源上的close
方法。这是销毁回调的完美示例。相关问题@user7294900 yeh相关,但它没有回答m(问题:)