Spring Bean的生命周期、后置处理器、定义继承

目录:html

  1. 了解Spring的基本概念spring

  2. Spring简单的示例app

  3. Spring Bean的定义及做用域ide

1.Bean的生命周期

Bean的生命周期能够简单的理解为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁函数

在其生命周期里,有两个重要的回调方法,能够在初始化Bean和销毁Bean时调用该方法。post

在这两个方法里能够额外作一些操做。测试

首先准备一个类this

public class Category {
    //属性
    private String name;
    SimpleDateFormat df=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.sss");
    //设置该属性的方法
    public void setName(String name){
        this.name=name;
    }
    //获取该属性的方法
    public void getName(){
        System.out.println(name);
    }
    //初始化回调
    public void start(){
        System.out.println("Bean开始使用时间:"+df.format(new Date()));
    }
    //销毁回调
    public void destroy(){
        System.out.println("Bean销毁时间:"+df.format(new Date()));
    }
}

再准备一个测试类url

public class TestSpring {
    public static void main(String[] args) throws InterruptedException {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Category category = (Category) context.getBean("c");
        category.getName();
        //睡眠1秒,更加明显看出两个方法的区别
        Thread.sleep(1000);
        context.registerShutdownHook();
    }
}    

测试类中,须要调用AbstractApplicationContext的registerShutdownHook()方法来确保正常关闭,而且调用相关的销毁的回调方法。spa

 

配置文件

<?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-3.0.xsd">
    <bean id="c" class="SpringBean.Base.Category" init-method="start" destroy-method="destroy">
        <property name="name" value="Hello Word"/>
    </bean>
</beans>

配置文件中,须要指定初始化回调的方法和销毁回调的方法。

最后输出的是:

Bean开始使用时间:2019-11-21 15:10:21.021
Hello Word
Bean销毁时间:2019-11-21 15:10:22.022

 

2.Bean的后置处理器

后置处理器就是在初始化方法的先后进行额外的操做。

上面的Category方法代码不变,再准备一个针对Category初始化的类,就叫initCategory 

public class initCategory implements BeanPostProcessor {

    @Override
    //会在bean初始化方法前执行
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("初始化以前执行:"+s);
        return o;
    }

    @Override
    //会在bean初始化方法后执行
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("初始化以后执行:"+s);
        return o;
    }
}

这个类须要实现BeanPostProcessor 接口,并重写其两个方法,方法内就能够写你须要的额外操做。

保持上面的配置文件不变,再加上一句:

<bean class="SpringBean.Base.initCategory"/>

class属性里写上本身的initCategory 类所在的位置

最后输出:

初始化以前执行:c
Bean开始使用时间:2019-11-21 15:16:12.012
初始化以后执行:c
Hello Word
Bean销毁时间:2019-11-21 15:16:13.013

 

 3.Bean的定义继承

bean的定义能够包含一大堆配置,好比:属性的值,构造函数的参数等。当其余bean须要用到这些设置时,不须要从新配置,只须要继承便可。

继承的用法就相对简单了,在上面代码基础上。能够再添加一个Category2类。内容与Category同样,再添加额外的属性name2和setName2,getName2方法。

并在配置文件中添加以下代码:

 <bean id="c2" class="SpringBean.Base.Category2" parent="c">
        <property name="name2" value="Hello Word2"/>
    </bean>

能够发现,c2中设置了parent属性,继承id为‘c’的bean。

设置属性当中,只设置了name2,并无设置name的值,可是调用Category2的getName方法,依旧会输出Hello Word

相关文章
相关标签/搜索