Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Springbean创建生命周期:为什么有多个交互点?_Java_Spring - Fatal编程技术网

Java Springbean创建生命周期:为什么有多个交互点?

Java Springbean创建生命周期:为什么有多个交互点?,java,spring,Java,Spring,我正在学习spring,我被bean生命周期困住了 当创建一个bean时,spring给了我们几个maner来与之交互。我们可以使用以下一种或全部: BeanFactory后处理器 BeanPostProcessor#初始化前的后处理 @PostConstruct 初始化bean#AfterPropertieSet @Bean#initMethod BeanPostProcessor#后处理器初始化后 Spring按上述顺序调用它们 我的问题是:为什么所有这些互动点?什么时候使用它们(用例)?A

我正在学习spring,我被bean生命周期困住了

当创建一个bean时,spring给了我们几个maner来与之交互。我们可以使用以下一种或全部:

BeanFactory后处理器

BeanPostProcessor#初始化前的后处理

@PostConstruct

初始化bean#AfterPropertieSet

@Bean#initMethod

BeanPostProcessor#后处理器初始化后

Spring按上述顺序调用它们


我的问题是:为什么所有这些互动点?什么时候使用它们(用例)?

A
BeanFactoryPostProcessor
和A
BeanPostProcessor
是完全不同的beast,也适用于不同的事物


BeanFactoryPostProcessor
将对bean的元数据进行操作(我喜欢称之为recipe),并对其进行后期处理。一个众所周知的例子是
propertysourcesplaceconfigurer
,它将用值注入/替换配置中的所有
@Value
BeanFactoryPostProcessor
在创建任何bean之前对元数据进行操作

BeanPostProcessor
可以应用于bean,甚至可以替换bean。SpringAOP经常使用这个。一个例子是
PersistenceExceptionTranslationPostProcessor
,当一个bean被创建时,它将通过这个
BeanPostProcessor
,当它被
@Persistence
注释时,这个bean将被一个代理所取代。此代理添加异常转换(即,它将
jpaeexception
SQLException
转换为Spring
DataAccessException
)。这是在
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(问题:)