Spring中的ref和depends-on區別
阿新 • • 發佈:2018-12-30
參考:http://yanln.iteye.com/blog/2210723
這兩者都是表示對其他bean的依賴,但是ref常用的情況是這個bean作為當前bean的屬性,比如:
<bean id="a" class="ClassA"/>
<bean id="b" class="ClassB">
<property name="aref" ref="a" />
</bean>
這是很強的一個依賴關係了,但是有時候依賴關係並不會這麼明顯,我們依賴的bean也許並不是我們當前bean的屬性,比如當前bean B,我們需要初始化一些值,這些值的初始化是依賴於bean A的,那麼我們的bean B肯定是依賴於A的,但是A並不是B的什麼,這個時候用ref肯定是不合適的,就可以用depends-on
舉個例子:某個論壇擁有很多系統引數:
public class SystemSettings{
//快取更新時間
public static int REFRESH_CYCLE = 60;
......
}
現在我們這些引數不再是寫死的,需要在後臺對這些引數進行管理:管理員可以對這些引數進行更改,並且會儲存入庫,系統啟動的時候,會從資料庫載入這些引數,假設載入引數的類是SystemInit
public class SystemInit{
public SystemInit (){
//模擬從資料庫中載入的系統引數配置值
SystemSettings.REFRESH_CYCLE=100;
......
}
}
我們的系統現在有一個定時配置重新整理器,用於定時重新整理這些配置:
public class CacheManager{
public CacheManager(){
Timer t = new Timer();
TimerTask cacheTask = new CacheTask();
//快取重新整理定時處理
t.schedule(cacheTask,0,SystemSettings.REFRESH_CYCLE);
}
......
}
在這個例子中,我們的CacheManager如果想要獲取最新配置,必須用到SystemSettings的值,而這個值需要用到我們的Bean SystemInit,SystemInit並不屬於我們的CacheManager的屬性或者其他的什麼。但是邏輯上SystemInit是要先於CacheManager載入的,這個時候就可以用dependds-on了:
<bean id="sysinit" class="SystemInit">
<bean id="manager" class="CacheManager" depends-on="sysinit"/>
除此之外,使用了depends-on的時候,依賴他人的bean是先於被依賴bean銷燬的
總結:depends-on適用於表面上看起來兩個bean之間沒有使用屬性之類的強連線的bean,但是兩個bean又確實存在前後依賴關係的情況,使用了depends-on的時候,依賴他人的bean是先於被依賴bean銷燬的