Bean
- 生命周期
生命周期
Bean 生命周期是 bean 对象从创建到销毁的整个过程。
简单的 Bean 生命周期的过程:
1.实例化(调用构造方法对 bean 进行实例化)
2.依赖注入(调用 set 方法对 bean 进行赋值)
3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指定调用对应的初始化方法)
4.使用 bean
5.销毁(与初始化方法同理,配置 destroy-method 属性值来调用销毁方法)
Bean 简单的生命周期示例:
package cn.edu.springdemo.beanDemo;
//Bean简单的生命周期测试类
public class BeanLifecycle {
private String instance;
public BeanLifecycle() {
super();
System.out.println("1.调用构造方法:实例化 bean ");
}
public void init() {
System.out.println("3.调用初始化方法:初始化 bean ");
}
public void destroy() {
System.out.println("5.调用销毁方法:关闭容器,bean 销毁");
}
public String getInstance() {
return instance;
}
public void setInstance(String instance) {
this.instance = instance;
System.out.println("2.调用set方法:给 bean 属性赋值");
}
@Override
public String toString() {
return "BeanLifecycle{" +
"instance='" + instance + '\'' +
'}';
}
}
xml配置:
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 初始化和销毁方法需要手动配置 -->
<bean id="beanLifecycle" class="cn.edu.springdemo.beanDemo.BeanLifecycle"
init-method="init" destroy-method="destroy"
p:instance="beanLifecycleInstance" />
</beans>
测试结果:
package cn.edu.springdemo.test;
import cn.edu.springdemo.beanDemo.BeanLifecycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AdminTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beanDemo.xml");
BeanLifecycle beanLifecycle = (BeanLifecycle) applicationContext.getBean("beanLifecycle");
System.out.println("4.使用bean:" + beanLifecycle);
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
结果如图:
复杂的 Bean 生命周期的过程:
1.实例化(调用构造方法对 bean 进行实例化)
2.依赖注入(调用 set 方法对 bean 进行赋值)
3.若 Bean 实现了 BeanNameAware 接口,则调用 setBeanName() 方法,传递 Bean 的 id 值
4.若 Bean 实现了 BeanFactoryAware 接口,则调用 setBeanFactory() 方法,传递 BeanFactory 对象的引用
5.若 Bean 实现了 ApplicationContextAware 接口,则调用 setApplicationContext() 方法,传递 ApplicationContext 对象的引用
6.若 Bean 实现了 BeanPostProcessor 接口,则调用 postProcessBeforeInitialization() 方法,对Bean进行预处理
7.若 Bean 实现了 InitializingBean 接口,则调用 afterPropertiesSet() 方法,执行自定义的初始化方法
8.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指定调用对应的初始化方法)
9.若 Bean 实现了 BeanPostProcessor 接口,则调用 postProcessAfterInitialization() 方法,对 Bean 进行后处理
10.当容器关闭时,若 Bean 实现了 DisposableBean 接口,则调用 destroy() 方法,执行自定义的销毁方法;若手动配置 xml 文件中 bean 标签的 destroy-method 属性值,则调用指定的销毁方法
生命周期的前后置方法示例(当发现某个属性值需要修改时,但又为了防止修改原代码后报异常。在原代码不变的情况下,可以使用其生名周期阶段来进行修改):
//Bean简单的生命周期测试类保持不变
package cn.edu.springdemo.beanDemo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
//BeanPostProcessor接口的实现类
public class BeanLifecycleBPP implements BeanPostProcessor {
//前置方法,在初始化方法执行前被调用
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用前置方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean,beanName);
}
//后置方法,在初始化方法执行后被调用
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用后置方法");
//获取 bean 并修改其属性值
BeanLifecycle beanLifecycle = (BeanLifecycle) bean;
//重新调用 set 方法进行属性赋值
beanLifecycle.setInstance("UpdateInstanceName");
return BeanPostProcessor.super.postProcessAfterInitialization(beanLifecycle,beanName);
}
}
xml配置:
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 初始化和销毁方法需要手动配置 -->
<bean id="beanLifecycle" class="cn.edu.springdemo.beanDemo.BeanLifecycle"
init-method="init" destroy-method="destroy"
p:instance="beanLifecycleInstance" />
<!-- 只需配置 class 属性即可 -->
<bean class="cn.edu.springdemo.beanDemo.BeanLifecycleBPP" />
</beans>
测试结果: