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

相關文章
相關標籤/搜索