1、什么是Bean的生命周期
我们知道Sprintg IOC容器管理的Bean都是单例模式,即每个Bean只有一个实例化的Bean对象存在于Spring IOC容器中,因次Spring IOC容器需要负责管理Bean的创建、使用和销毁的整个过程,也就是Bean的生命周期。
2、生命周期演示
下面先以Bean自身方法和Bean生命周期接口方法为例,演示其各个生命周期的执行时序。
- init-method:指定某个方法在Bean实例化完成,依赖关系设置结束后执行。
- destroy-method:指定某个方法在Bean销毁之前被执行。
- InitializingBean接口:指定在Bean实例化完成,依赖关系设置结束后执行(在init-method之前执行)。
- DisposableBean接口:指定某个方法在Bean销毁之前被执行(在destory-method之前执行)。
- ApplicationContextAware接口:在实例化Bean时,为Bean注入ApplicationContext。
- BeanNameAware接口:在实例化Bean时,为Bean注入beanName。
以下代码BeanLifecycle将实现上述4个接口InitializingBean、DisposableBean、ApplicationContextAware和BeanNameAware,并在XML文件中配置该Bean的init-method和destroy-method。
package cn.exercise.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class Student implements InitializingBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware, DisposableBean {
public Student() {
System.out.println("1.【Bean级别】创建了Student对象");
}
/**
* BeanNameAware接口的方法
* @param name
*/
@Override
public void setBeanName(String name) {
System.out.println("2.【Bean级别】执行了接口BeanNameAware的setBeanName()方法,beanName="+name);
}
/**
* BeanFactoryAware
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3.【Bean级别】执行了接口BeanFactoryAware的setBeanFactory()方法");
}
/**
* ApplicationContextAware
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("4.【Bean级别】执行了接口ApplicationContextAware的setApplicationContext()方法");
}
/**
* InitializingBean 接口方法
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5.【Bean级别】执行了接口InitializingBean的afterPropertiesSet()方法 ");
}
/**
* DisposableBean
* @throws Exception
*/
@Override
public void destroy() throws Exception {
System.out.println("8.【Bean级别】调用DisposableBean接口的destroy()方法");
}
public void lifecycleInit(){
System.out.println("6.【Bean级别】调用了init方法");
}
public void lifecycleInitDestroy(){
System.out.println("9.【Bean级别】容器销毁前调用了destroy方法");
}
public void sayHello(){
System.out.println("7.【Bean级别】调用Bean自身的业务方法");
}
}
如上述代码中的注释所示,BeanLifecycle这个Bean的生命周期将按照序号1~8顺序执行。
在配置文件中进行如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean class="cn.exercise.bean.BeanLifecycle" id="beanLifecycle" init-method="lifecycleInit"
destroy-method="lifecycleInitDestroy"></bean>
</beans>
下面是对BeanLifecycle准备的测试代码:
package cn.exercise.test;
import cn.exercise.bean.BeanLifecycle;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
BeanLifecycle beanLifecycle = (BeanLifecycle) context.getBean("beanLifecycle");
beanLifecycle.sayHello();
context.close();
}
}
上述测试代码很简单,就是通过从Spring IoC容器中注入的BeanLifecycle对象,调用其sayHello()方法。测试代码运行后的结果如图所示:
通过执行结果可以得到Bean自身方法和Bean生命周期接口方法的执行时序:
- 执行构造器。
- 为对象中的属性注入值
- 执行BeanNameAware接口的setBeanName(String name)方法。
- 执行BeanFactoryAware接口的setBeanFactory()方法
- 执行ApplicationContextAware接口的setApplicationContext(ApplicationContextapplication Context)方法。
- 执行InitializingBean接口的afterPropertiesSet()方法。
- 执行init-method指定的方法。
- 执行运行时Bean中的业务方法。
- 执行DisposableBean接口的destroy()方法。
- 执行destroy-method指定的方法。
Bean自身方法和Bean生命周期接口方法执行的生命周期如图所示:
通过BeanLifecycle例子将可以更加清晰的了解到Bean自身方法和Bean生命周期接口方法的生命周期。