SSH笔记-IOC容器中 Bean 的生命周期

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

猜你喜欢

转载自blog.csdn.net/qq_22778717/article/details/80658841