1、Spring IOC 容器对 Bean 的生命周期进行管理的过程:
①通过构造器或工厂方法创建 Bean 实例
②为 Bean 的属性设置值和对其他 Bean 的引用
③调用 Bean 的初始化方法
④使用Bean
⑤当容器关闭时, 调用 Bean 的销毁方法
2、实现指定初始方法和销毁方法的两种方法:
①在 Bean 的声明里设置 init-method 和 destroy-method 属性, 可以为 Bean 指定初始化和销毁方法
②实现BeanPostProcessor接口,并实例化postProcessAfterInitialization和postProcessBeforeInitialization方法
3、文件
①TestLifeCycle.java:测试类
②LifeCycleBean.java:数据模型
③LifeCyclePostProcessor.java:实现生命周期初始、销毁方法的类
④lifeCycleContext.xml:配置文件
4、TestLifeCycle.java
package com.demo.sshtest.lifeCycle;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestLifeCycle {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("lifeCycleContext.xml");
LifeCycleBean lifeCycleBean = (LifeCycleBean)applicationContext.getBean("lifecyclebean");
System.out.println(lifeCycleBean);
applicationContext.close();
}
}
5、LifeCycleBean.java
package com.demo.sshtest.lifeCycle;
public class LifeCycleBean {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "LifeCycleBean [str=" + str + "]";
}
public LifeCycleBean() {
super();
System.out.println("LifeCycleBean construtor");
}
public void initMethod(){
System.out.println("initMethod");
}
public void destoryMethod(){
System.out.println("destoryMethod");
}
}
6、LifeCyclePostProcessor.java
package com.demo.sshtest.lifeCycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class LifeCyclePostProcessor implements BeanPostProcessor{
//这两个方法分别是bean中设置的init-method运行前后运行的,都需要return一个bean出去,可以为接受到的Object中的bean,也可以是方法中新创建的bean
//这个类实现了BeanPostProcessor接口,所以这个类是监听所有配置了这个类的配置文件中的bean的,所以需要根据beanName的值,去对应地判断哪个bean需要进行什么处理
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization"+" bean:"+bean+"--beanName:"+beanName);
LifeCycleBean lifeCycleBean0 = new LifeCycleBean();
LifeCycleBean lifeCycleBean1 = new LifeCycleBean();
LifeCycleBean lifeCycleBean2 = new LifeCycleBean();
if(bean==null){
lifeCycleBean0.setStr("after 0 string");
return lifeCycleBean0;
}else if("lifecyclebean".equals(beanName)){
lifeCycleBean1.setStr("after 1 string");
return lifeCycleBean1;
}else{
lifeCycleBean2.setStr("after 2 string");
return lifeCycleBean2;
}
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization"+" bean:"+bean+"--beanName:"+beanName);
LifeCycleBean lifeCycleBean3 = new LifeCycleBean();
lifeCycleBean3.setStr("before string");
return lifeCycleBean3;
}
}
7、lifeCycleContext.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="lifecyclebean" class="com.demo.sshtest.lifeCycle.LifeCycleBean"
init-method="initMethod" destroy-method="destoryMethod">
<property name="str" value="str String 1"></property>
</bean>
<!-- 配置bean的后置处理器 -->
<!--
实现BeanPostProcessor接口两个方法
(1)postProcessAfterInitialization(Object bean, String beanName) : init-method之后调用
(2)postProcessBeforeInitialization(Object bean, String beanName): init-method之前调用
使用方法:只需要配置后置处理器的bean全类名,不需要配置id,即可监听该配置文件中所有bean
该bean的类中能接收到的属性值:
(1)bean:bean实例本身
(2)beanName:IOC容器配置的bean的名字
(3)返回值:返回给用户的bean,不能为null,可以是(1)中的bean,也可以是方法中新创建的bean实例
-->
<bean class="com.demo.sshtest.lifeCycle.LifeCyclePostProcessor"></bean>
</beans>
8、项目目录
9、demo
https://download.csdn.net/download/qq_22778717/10472900