spring Framework 提供了许多接口,您可以使用它们来自定义 bean 的性质。
生命周期回调
要与容器对 bean 生命周期的管理进行交互,可以实现 SpringInitializingBean
和DisposableBean
接口。容器要求 afterPropertiesSet()
前者和destroy()
后者让 bean 在初始化和销毁 bean 时执行某些操作。
在内部,Spring 框架使用BeanPostProcessor
实现来处理它可以找到的任何回调接口并调用适当的方法。如果你需要自定义特性或其他生命周期行为 Spring 默认不提供,你可以BeanPostProcessor
自己实现一个。
除了初始化和销毁回调之外,Spring 管理的对象还可以实现该Lifecycle
接口,以便这些对象可以参与容器自身生命周期驱动的启动和关闭过程。
初始化回调
在容器为 bean 设置了所有必要的属性后,该org.springframework.beans.factory.InitializingBean
接口允许 bean 执行初始化工作。该InitializingBean
接口指定了一个方法:
void afterPropertiesSet() throws Exception;
我们建议您不要使用该InitializingBean
接口,因为它不必要地将代码耦合到 Spring。或者,我们建议使用@PostConstruct
注解或指定 POJO 初始化方法。
销毁回调
实现该org.springframework.beans.factory.DisposableBean
接口可以让 bean 在包含它的容器被销毁时获得回调。该 DisposableBean
接口指定了一个方法:
void destroy() throws Exception;
我们建议您不要使用DisposableBean
回调接口,因为它不必要地将代码耦合到 Spring。或者,我们建议使用@PreDestroy
注释或指定 bean 定义支持的通用方法
默认初始化和销毁方法
当您编写不使用 Spring 特定InitializingBean
和DisposableBean
回调接口的初始化和销毁方法回调时,您通常会编写名称为init()
、initialize()
、dispose()
等的方法。理想情况下,此类生命周期回调方法的名称在整个项目中是标准化的,以便所有开发人员使用相同的方法名称并确保一致性。
<beans default-init-method="init">
<bean id="blogService" class="com.something.DefaultBlogService">
<property name="blogDao" ref="blogDao" />
</bean>
</beans>
启动和关闭回调
该Lifecycle
接口定义了任何具有自己生命周期要求的对象的基本方法(例如启动和停止某些后台进程):
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
任何 Spring 管理的对象都可以实现该Lifecycle
接口。然后,当 ApplicationContext
自身接收到启动和停止信号时(例如,对于运行时的停止/重新启动场景),它会将这些调用级联到Lifecycle
该上下文中定义的所有实现。它通过委托给 a 来做到这一点LifecycleProcessor
,如以下清单所示:
public interface LifecycleProcessor extends Lifecycle {
void onRefresh();
void onClose();
}
请注意,LifecycleProcessor
它本身就是Lifecycle
接口的扩展。它还添加了另外两种方法来对正在刷新和关闭的上下文做出反应。
ApplicationContextAware
和BeanNameAware
当 一个创建一个实现ApplicationContextAware接口的对象实例时,会为该实例提供对该 的引用
ApplicationContext`。
当ApplicationContext
创建一个实现 BeanNameAware
接口的类时,该类被提供了对其关联对象定义中定义的名称的引用。
其他Aware
接口
Spring 提供了广泛的Aware
回调接口,让 bean 向容器指示它们需要特定的基础设施依赖项。