Spring Bean的生命週期、後置處理器、定義繼承
目錄:
-
瞭解Spring的基本概念
-
Spring簡單的示例
-
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