1. 程式人生 > >Spring中的ref和depends-on區別

Spring中的ref和depends-on區別

參考: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銷燬的