1. 程式人生 > >Spring Bean的生命週期、後置處理器、定義繼承

Spring Bean的生命週期、後置處理器、定義繼承

目錄:

  1. 瞭解Spring的基本概念

  2. Spring簡單的示例

  3. Spring Bean的定義及作用域

1.Bean的生命週期

Bean的生命週期可以簡單的理解為:Bean的定義——Bean的初始化——Bean的使用——Bean的銷燬

在其生命週期裡,有兩個重要的回撥方法,可以在初始化Bean和銷燬Bean時呼叫該方法。

在這兩個方法裡可以額外做一些操作。

首先準備一個類

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

再準備一個測試類

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()方法來確保正常關閉,並且呼叫相關的銷燬的回撥方法。

 

配置檔案

<?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