Spring學習(二十)Bean 的依賴關係介紹

在Spring容器中,兩個Bean之間 除了注入關係外,還存在 繼承、依賴、引用 三種關係:
  • 繼承關係:在Spring容器當中允許使用abstract標籤來定義一個父bean,parent標籤來定義一個子bean。子bean將自動繼承父bean的配置信息。
  • 依賴關係:Spring允許用戶通過depends-on標籤來設定bean的前置依賴bean,前置依賴的bean會在本bean實例化之前就創建好,來供本bean使用。
  • 引用關係:我們不光可以通過ref標籤來引用其他的bean,而且可以通過idref標籤來引用其他bean的名字。他的主要作用是:在Spring容器啓動的時候就可以檢查引用關係的正確性。那麼這樣就可以提前發現配置信息是否存在錯誤。

一.繼承關係
在面向對象的編程原理中,當多個類擁有相同的方法和屬性,則可以引入父類消除代碼重複。
在Spring容器中,如果多個Bean存在相同的配置信息,同樣可以定義一個父Bean子Bean將自動繼承父Bean的配置信息。父bean中的所有屬性值也會出現在子bean當中,那麼假如子bean當中配置了父bean已有的屬性的話,會覆蓋掉父bean中的配置。
配置爲父bean的bean當中的abstract屬性值得賦值爲true
我們來看一個示例:
1. 未使用父子<bean>的配置
<bean id=“car1” class=“cn.lovepi.***.Car”
     p:brand=“奔馳E300” p:price=“2000” p:color=“黑色”/>
<bean id=“car1” class=“cn.lovepi.***.Car”
     p:brand=“奔馳E300” p:price=“2000” p:color=“紅色”/>
可以看到,兩個car bean除了color屬性不同之外,其他屬性都是完全一樣的。
2. 使用父子<bean>的配置
<bean id=“abstractCar” class=“cn.lovepi.***.Car”
     p:brand=“奔馳E300” p:price=“2000” p:color=“黑色” abstract=“true”/>
<bean id=“car1” p:color=“紅色” parent=“abstractCar” />
<bean id=“car1” p:color=“白色” parent=“abstractCar” />
可以看到car1和car2這兩個bean都繼承自abstractCar這個父bean,在上面的代碼中子bean就只改變了color屬性,其他屬性都跟父類相同。
二.依賴關係
在Spring容器中,當使用depends-on標籤建立對其他Bean的依賴關係時,Spring容器負責管理這些Bean的關係,當實例化一個Bean時,容器保證該Bean所依賴的Bean已經初始化;如果前置依賴多個Bean,可以通過逗號空格方式配置Bean名稱。
我們來看一個示例:
在某論壇系統當中,具有很多的啓動參數,比如:會話過期時間、緩存更新時間等。這些啓動參數用來控制系統的運行邏輯,我們使用一個SystemSetting類來表示這些參數。
public class SystemSetting{
      public static int SESSION_TIMEOUT = 30;
      public static int REFRESH_CYCLE = 60;
}
在這裏我們定義了兩個系統參數,我們這裏直接定義了這兩個參數的值,但在真正的論壇系統當中這些值應該是可以動態設置的,並及時保存到後臺數據庫當中。在系統啓動時,初始化程序來從後臺數據庫獲取這些系統參數的配置值以覆蓋默認的值。
在這裏我們模擬從數據庫中加載系統值。
public class SysInit{
    public SysInit() {
        SystemSettings.SESSION_TIMEOUT = 10;
        SystemSettings.REFRESH_CYCLE = 100;   }
}

假設我們的系統需要一個緩存刷新管理器,他需要根據SystemSettings.REFRESH_CYCLE  的值來創建緩存定時刷新任務,那麼請看如下 的代碼:
public class CacheManager {
    public CacheManager(){
      Timer timer = new Timer();
      TimerTask cacheTask = new CacheTask();
      timer.schedule(cachetask,0,SystemSettings.REFRESH_CYCLE);
      }
}
在以上的三段代碼中,CacheManager依賴與SystemSetting,而SystemSetting又依賴與SysInit
可以看到SysInit必須首先執行然後才能執行接下來的代碼。
如果這三個bean都在Spring當中定義,那麼我們該如何保證SysInit bean被首先執行呢?
那麼就得使用depends-on屬性標籤了
<bean id=“manager” class=“cn.lovepi.***.CacheManager”depends-on=“sysInit”/>
<bean id=“sysInit” class=“cn.lovepi.***.SysInit” />
三.引用關係
在Spring容器中,當使用<ref>標籤引用另外一個Bean時,但實際上兩者並沒有建立引用關係,即使我們編寫錯誤,也需要在運行期纔可以發現。
因此Spring提供了<idref>元素標籤,通過<idref>引用另一個Bean的名字,可以在容器啓動的時候,檢查引用關係的正確性,這樣可以提前發現錯誤的配置信息
1. 常規配置方法
<bean id=“car” class=“cn.lovepi.***.Car”/>
<bean id=“boss” class=“cn.lovepi.***.Boss”
                p:carId=“car” scope=“prototype” />
2. <idref>配置方法
<bean id=“car” class=“cn.lovepi.***.Car”/>
<bean id=“boss” class=“cn.lovepi.***.Boss” >
      <property name=“carId”>
             <idref bean=“car”/>
      </property>
</bean>
總結:
Spring爲bean提供了一系列的關係:注入、繼承、依賴、引用
使用bean之間的關係可以將代碼中繁瑣的類間關係轉移到配置文件當中來,降低了代碼的耦合性,也方便系統的模塊化管理。








發佈了68 篇原創文章 · 獲贊 132 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章