Spring5-------------bean生命周期

bean的生命周期可以分为五个阶段

(1)实例化

(2)属性赋值

(3)初始化

(4)使用

(5)销毁

 

 

常用扩展点

InstantiationAwareBeanPostProcessor:作用于实例化阶段的前后

BeanPostProcessor:作用于初始化阶段的前后

InstantiationAwareBeanPostProcessor实际上继承了BeanPostProcessor接口

 

 

Course.java

package com.tang.spring;

public class Course {
    private String cname;

    public Course() {
        System.out.println("第一步:执行无参构造器创建bean实例");
    }

    public void setCname(String cname) {
        this.cname = cname;
        System.out.println("第二步:调用set方法设置属性值");
    }

    //创建初始化方法
    public void init(){
        System.out.println("第三步:执行初始化方法");
    }

    //创建销毁方法
    public void destroy(){
        System.out.println("第五步:执行销毁方法");
    }

    @Override
    public String toString() {
        return "Course{" +
                "cname='" + cname + '\'' +
                '}';
    }
}

  

后置处理器

package com.tang.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

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;
    }
}

  

配置文件

<bean id="course" class="com.tang.spring.Course" init-method="init" destroy-method="destroy">
        <property name="cname" value="数据库"></property>
    </bean>

    <!--    配置后置处理器-->
    <bean id="myprocessor" class="com.tang.spring.MyBeanPostProcessor"></bean>

  

测试

package com.tang.spring.testdemo;

import com.tang.spring.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void testAdd() {
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //获取配置创建的对象
        Course course = context.getBean("course", Course.class);
        System.out.println("第四步:获取bean实例对象");

        System.out.println(course);

        //手动销毁bean实例对象
        ((ClassPathXmlApplicationContext) context).close();
    }
}

  

 

posted @ 2021-04-02 11:46  455994206  阅读(87)  评论(0)    收藏  举报