目錄:html
瞭解Spring的基本概念spring
Spring簡單的示例app
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
後置處理器就是在初始化方法的先後進行額外的操做。
上面的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
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