1.Spring Bean
生命周期概述
传统java
对象的生命开始于调用实例化对象的new
运算符,并且在对象符合垃圾回收的条件时调用finalize()
方法。与传统的java
对象相比,Spring bean
的生命周期不同。
Spring
框架提供了以下可用来控制Bean
生命周期的方法:
InitializingBean
和DisposableBean
回调接口;BeanName
,BeanFactory
和ApplicationContext
用于特定行为的Aware
接口;- 在
Bean
配置文件中配置自定义的init()
和destroy()
方法; - 基于注解的配置 -
@PostConstruct
和@PreDestroy
注解;
下图显示了完整的生命周期方法(从实例化到准备使用)。
下图显示销毁时调用的方法。
1.1 InitializingBean
和DisposbleBean
回调接口
InitalizingBean
接口是在org.springframework.beans.factory
包下定义的,并声明了一个可用于添加任何初始化相关代码的方法。实现InitalizingBean
的任何Bean
都需要提供afterPropertiesSet()
方法的实现。
方法的签名是:
void afterPropertiesSet() throws Exception;
- 同样,
DisposableBean
接口在org.springframework.beans.factory
下定义并声明了一个单独的方法,当Bean
被销毁时可以被执行,并且可以用来添加任何清理相关的代码。实现DisposableBean
的任何Bean
都需要提供destroy()
方法的实现。
方法的签名是:
void destroy() throws Exception;
这种方法使用起来很简单,但不推荐,因为它会在我们的Bean
实现中与Spring
框架紧密耦合。
1.2 BeanName
,BeanFactory
和ApplicationContext
的Aware
接口
Several times functionality requires infrastructure or we can say application context information in a bean
在Bean
中多数功能需要用到基础架构信息,或者我们可以说是应用程序的上下文信息。为了实现这些功能,Spring
框架提供了一系列Aware
接口,每个接口都要求我们实现一个方法来在Bean
中注入依赖。
最常用的是 -
BeanFactoryAware
- 该接口提供了setBeanFactory()
方法,该方法将拥有的Bean
工厂实例提供给Bean
.
方法签名是:
void setBeanFactory(BeanFactory beanFactory) throws BeansException
BeanNameAware
- 该接口提供了setBeanName()
方法,该方法在创建该Bean
的Bean
工厂中设置Bean
的名称.
方法签名是:
void setBeanName(String name);
ApplicationContextAware
-该接口提供了setApplicationContext()
方法,该方法将所拥有的应用程序上下文实例提供给Bean
。
方法签名是:
void setApplicationContext(ApplicationContext applicationContext) throws BeansException
1.3 在Bean
配置文件中自定义init()
和destroy()
方法
实现InitalizingBean
和DisposableBean
接口很容易使用,但在我们的Bean
实现中与Spring
框架紧密结合。
或者,我们可以在Spring Bean
配置文件中为Bean
的init-method
和destroy-method
自定义属性值。这是推荐的方法,因为没有直接依赖Spring
框架,我们可以创建自己的方法。
注意:post-init
和pre-destroy
方法都应该没有参数,但可以引发异常。
<beans>
<bean id="bean_id" class="bean.class"
init-method="customInitmethod"
destroy-method="customDestroymethod">
</bean>
</beans>
我们可以配置将应用于所有Bean
的默认init-method
和destroy-method
(全局)。当我们有一个为所有Bean
一致定义常用方法名称,如init()
和destroy()
的模式时,它们非常有用。
<beans default-init-method=”customDefaultInitMethod” default-destroy-method=”customDefaultDestroyMethod” >
<bean id="bean_id" class="bean.class" >
</bean>
</beans>
2.Spring Aware
有时我们需要在我们的bean
中使用Spring Framework
对象来执行一些操作,例如读取ServletConfig
和ServletContext
参数,或者了解由ApplicationContext
加载的bean
定义,这就是为什么Spring
框架提供了一堆* Aware
接口,我们可以在我们的bean
类中实现这些接口。
Spring Aware
接口类似于具有回调方法和实现观察者设计模式的Servlet Listener
。
一些重要的Aware
接口:
ApplicationContextAware
– 注入ApplicationContext
对象, 示例用法是获取bean定义名称的数组.BeanFactoryAware
– 注入BeanFactory
对象, 示例用法是检查bean
的范围.BeanNameAware
– 了解配置文件中定义的bean
名称.ResourceLoaderAware
– 注入ResourceLoader
对象, 示例用法是获取类路径中文件的输入流.ServletContextAware
– 在MVC
应用程序中注入ServletContext
对象, 示例用法是读取上下文参数和属性.ServletConfigAware
– 在MVC
应用程序中注入ServletConfig
对象, example 用法是获取servlet配置参数.
【参考资料】