spring 容器中的bean的完整生命周期一共分为十一步完成。
1.bean对象的实例化
2.封装属性,也就是设置properties中的属性值
3.如果bean实现了BeanNameAware,则执行setBeanName方法,也就是bean中的id值
4.如果实现BeanFactoryAware或者ApplicationContextAware ,需要设置setBeanFactory或者上下文对象setApplicationContext
5.如果存在类实现BeanPostProcessor后处理bean,执行postProcessBeforeInitialization,可以在初始化之前执行一些方法
6.如果bean实现了InitializingBean,则执行afterPropertiesSet,执行属性设置之后的操作
7.调用执行指定的初始化方法
8.如果存在类实现BeanPostProcessor则执行postProcessAfterInitialization,执行初始化之后的操作
9.执行自身的业务方法
10.如果bean实现了DisposableBean,则执行spring的的销毁方法
11.调用执行自定义的销毁方法。
第五步和第八步可以结合aop,在初始化执行之前或者执行之后执行一些操作。
bean对象:
/**
* @author Dames
* @create 2021-11-20-23:34
*/
public class Man implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String name;
public Man() {
System.out.println("第一步:实例化类");
}
public void setName(String name) {
System.out.println("第二步:设置属性");
this.name = name;
}
@Override
public void setBeanName(String s) {
System.out.println("第三步:设置bean的名称也就是spring容器中的名称,也就是id值" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("第四步:了解工厂信息ApplicationContext");
}
//第五步执行初始化之前执行的方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:属性设置后执行的方法");
}
public void setup() {
System.out.println("第七步:执行自己配置的初始化方法");
}
//第八步执行初始化之后执行的方法
public void run() {
System.out.println("第九步:执行自身的业务方法");
}
@Override
public void destroy() throws Exception {
System.out.println("第十步:执行spring的销毁方法");
}
public void sefDestory() {
System.out.println("第十一步:执行自己配置的销毁方法");
}
}
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="spring5_test.Bean.MyBean"></bean>
<!--
Bean对象的初始化方法和销毁方法都要在bean标签中配置
通过init-method和destroy-method属性配置,
其值为对象类中定义的两个方法的方法名
-->
<bean id="orders" class="spring5_test.Bean.Orders"
init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="手机"></property>
</bean>
<!--配置后置处理器-->
<!--后置处理器会为xml所有Bean实例都添加后置处理器处理-->
<bean id="myBeanPost" class="spring5_test.Bean.MyBeanPostProcessor"></bean>
<bean id="man" class="spring5_test.Bean.Man"
init-method="setup" destroy-method="sefDestory">
<property name="name" value="Dames"></property>
</bean>
</beans>
实现接口 BeanPostProcessor的后置处理器:
/**
* 创建类,实现接口 BeanPostProcessor,创建后置处理器
* @author Dames
* @create 2021-11-20-23:08
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
测试类方法:
@Test
public void Test9() {
// ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
/**
* ClassPathXmlApplicationContext是ApplicationContext的子接口的实现类,
* 这个类中才有手动销毁的close()方法
*/
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
Man man = context.getBean("man", Man.class);
man.run();
//手动让 bean 实例销毁
context.close();
}
结果: