目录
- 一、Spring bean的生命周期
- 二、连接池配置
- 三、延时加载机制
一、Spring bean的生命周期
- 传统的Java应用中,bean的生命周期为:使用new 进行Bean的实例化,然后使用该Bean。一旦bean不再被使用,则由Java自动进行垃圾回收。
- 在Spring框架应用中,所有的Bean对象都有从创建、初始化、服务到销毁的这个过程,我们称之为Bean对象的生命周期。Spring Bean的生命周期比传统的Java应用的生命周期要复杂,但其可扩展性强。
Spring Bean实例生命周期的执行过程如下:
- Spring启动,查找并加载需要被Spring管理的Bean,对Bean进行实例化,默认Bean是单例;
- Spring实例化后对Bean进行依赖注入;
- 如果Bean实现了BeanNameAware接口,Spring将Bean的id传给setBeanName()方法;
- 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory方法,将BeanFactory实例传进来;
- 如果Bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到Bean中;
- 如果Bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;
- 如果Bean实现了InitializingBean接口,Spring将调用它的afterPropertiesSet接口方法,类似的如果Bean使用了init-method属性声明了初始化方法,则再调用该方法;
- 如果Bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
- 此时Bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
- 若Bean实现了DisposableBean接口,Spring将调用它的distroy()接口方法。如果Bean使用了destroy-method属性声明了销毁方法,则再调用该方法;
二、连接池配置
在Spring配置文件中,我们可以通过配置init-method,destory-method的属性来指定Bean的生命周期方法。
<!-- 比如连接池的配置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="close">
</bean>
在连接池的配置中,我们可以为连接池指定由连接池提供的 init 和 close 的方法来给连接池对象指定生命周期。
在Spring中Bean对象的销毁是由Bean对象的作用域的配置来决定的:
1、singleton 作用域的对象可以在容器关闭时会由Spring调用对象的销毁资源的方法来销毁Bean对象;
2、prototype 作用域的对象可以由容器创建对象,初始化对象,但Spring容器不负责销毁。
三、延时加载机制
在Spring框架应用中,容器初始化时会默认构建所有由Spring管理的对象,但如果这些对象长时间不使用还占着内存就会造成一定的资源浪费,为了解决这个问题,Spring中还提供了一种延时加载机制,以此来提高系统资源的有效使用。
Spring 中的延时加载有两种方式:
1)在bean元素中将 lazy-init 属性的值设为 false,这种方式只对当前设置的单个bean元素有效:
<!-- 例如连接池的延时加载设置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="close"
lazy-init="false">
</bean>
2)在beans元素中将 default-lazy-init 属性的值设为 true ,这种方式用于指定 beans 标签中所有 bean 的延时加载策略。例如:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="cPool"
class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="destroy">
</bean>
</beans>