1. 程式人生 > >Spring的depends-on屬性Bean依賴

Spring的depends-on屬性Bean依賴

Spring核心研究-管理bean之間的關係一(depends-on)

depend-on用來表示一個Bean的例項化依靠另一個Bean先例項化。如果在一個bean A上定義了depend-on B那麼就表示:A 例項化前先例項化 B。
這種情況下,A可能根本不需要持有一個B物件。
比如說,你的DAO Bean例項化之前你必須要先例項化Database Bean,DAO Bean並不需要持有一個Database Bean的例項。因為DAO的使用是依賴Database啟動的,如果Database Bean不啟動,那麼DAO即使例項化也是不可用的。這種情況DAO對Database的依賴是不直接的。
除了在DAO上使用建構函式注入Database Bean以外,Spring沒有任何依賴注入的關係能夠滿足上面的情況。但是DAO也許根本不需要Database的例項被注入,因為DAO是通過JDBC訪問資料庫的,它不需要呼叫Database 上的任何方法和屬性。

在這種情況下你可以使用depends-on來定義在DAO被例項化之前先去例項化Database。你可這樣定義:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<beanname="dao"class="research.spring.beanfactory.ch3.Dao"depends-on="database"
> </bean> <beanid="database"class="research.spring.beanfactory.ch3.Database"> </bean> </beans>
通過定義depends-on=”database”可以控制Sping例項化dao的順序。在任何時候Spring總會保證例項化DAO之前先例項Database。
通常depends-on常常應用在上面的場景中。如果DAO depend-on Database的同時需要得到Database的例項,那麼使用建構函式注入是一個比較好的解決辦法。因為建構函式注入的方式是要先例項化目標物件依賴的物件然後在例項化目標物件。

DAO depend-on Database時,也可以在DAO上定義setDatabase方法來接收一個Database的例項。這樣Sping會保證DAO建立前先建立Database例項,然後在把例項化DAO後呼叫DAO的setDatabase方法把剛才建立的Database的例項注入給DAO。前提條件時Database必須定義成單例的。否則Spring在DAO depend-on Database時會建立一個Database的例項,在DAO.setDatabase時又會建立Database另外的一個例項。這種情況可能不是你想要的,而且很可能會造成比較隱蔽的錯誤。
使用set方法注入depend-on的物件:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanname="dao"class="research.spring.beanfactory.ch3.Dao" depends-on="database "> <propertyname="database"> <refbean="database"></ref> </property> </bean> <beanid="database" class="research.spring.beanfactory.ch3.Database"> </bean> </beans>


一般在depends-on一個物件並且又需要這個物件例項的情況下,我都建議你使用建構函式的注入方式替換depend-on。只有不能建構函式中新增依賴物件引數的情況下才使用上面例子裡的方式。 可以同時使用depends-on和建構函式注入,如A depends-on B 並且 new A(B b)。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanname="dao"class="research.spring.beanfactory.ch3.Dao" depends-on="database"> <constructor-arg> <refbean="database"></ref> </constructor-arg> </bean> <beanid="database" class="research.spring.beanfactory.ch3.Database"> </bean> </beans>


然而這種做法是不合適的,因為在構在函式中注入依賴物件的方式可以包含depends-on的情況。也就時說new A(B b)包含了A depends-on B的所有情況。既然已經定義了new A(B b)就沒有必要在定義A depends-on B。所以,new A(B b)可以替代A depends-on B在A建立前必須建立B,而且A不需要使用B例項的情況下只能使用A depends-on B。

Spring允許Bean和Bean依賴的Bean(合作者)上同時定義depends-on。比如A depends-on B && B depends-on C && C depends-on D。下面這樣定義是合法的。Sping例項化他們的順序是D->C->B->A。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanname="a"class="research.spring.beanfactory.ch3.A" depends-on="b"/> <beanname="b"class="research.spring.beanfactory.ch3.B" depends-on="c"/> <beanname="c"class="research.spring.beanfactory.ch3.C" depends-on="D"/> <beanname="d"class="research.spring.beanfactory.ch3.D"/> </beans>

但是Spring不允許A depends-on B && B depends-on A的情況。看下面的例子,由於D又依賴回A,這種在依賴關係中形成了一個閉環,Spring將無法處理這種依賴關係。所以下面的這種定義是不合法的。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanname="a"class="research.spring.beanfactory.ch3.A" depends-on="b"/> <beanname="b"class="research.spring.beanfactory.ch3.B" depends-on="c"/> <beanname="c"class="research.spring.beanfactory.ch3.C" depends-on="D"/> <beanname="d"class="research.spring.beanfactory.ch3.D" depends-on="A"/> </beans>

一個Bean可以同時depends-on多個物件如,A depends-on D,C,B。可以使用“,”或“;”定義多個depends-on的物件。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <beanname="a"class="research.spring.beanfactory.ch3.A" depends-on="d,c,b"/> <beanname="b"class="research.spring.beanfactory.ch3.B"/> <beanname="c"class="research.spring.beanfactory.ch3.C"/> <beanname="d"class="research.spring.beanfactory.ch3.D"/> </beans>


上面的例子中A的例項化需要先例項化D,C,B。Spring會按照depend-on中定義的順序來處理Bean。在這個例子裡Spring例項化物件 的順利是D->C->B->A。雖然例項化物件的順序和前面“A depends-on B && B depends-on C && C depends-on D”的情況一下,但是這裡的意義是完全不同的。不能用“A depends-on D,C,B”代替“A depends-on B && B depends-on C && C depends-on D”。

depends-on是一個非常又用的功能,藉助depends-on我們可以管理那些依賴關係不明顯或者沒有直接依賴關係的物件。

相關推薦

Spring的depends-on屬性Bean依賴

Spring核心研究-管理bean之間的關係一(depends-on) depend-on用來表示一個Bean的例項化依靠另一個Bean先例項化。如果在一個bean A上定義了depend-on B那麼就表示:A 例項化前先例項化 B。這種情況下,A可能根本不需要持有一個

bean屬性依賴注入方式

四種: 目錄結構: set方法注入: mapper: service: 測試: applicationContext: 構造器方法注入: mapper:(不變) service: 測試類:(不變) appli

數據庫三範式 無重復列 完全依賴主鍵 屬性依賴非主屬性

str 信息 post 子函數 要求 實體 名稱 傳遞 一個數 細說數據庫三範式 2.1 第一範式(1NF)無重復的列 第一範式(1NF)中數據庫表的每一列都是不可分割的基本數據項 同一列中不能有多個值 即實體中的某個屬性不能有多個

WPF屬性(一)依賴屬性

沒有 http readonly har https 默認 lease clr 數據源 原文:WPF屬性(一)依賴屬性 依賴屬性是一種可以自己沒有值,並能通過使用B

DB2——表的append on屬性

表示 掃描 del 提高 ack app color 追加 批量 ALTER TABLE tablename APPEND ON|OFF ON:新添加的數據將會插入到有空閑空間的頁中; OFF:新增加的數據存放到最後一個頁上,若該頁存放滿了,則數據將會存放到下一個頁上。 數

[UWP]為附加屬性依賴屬性自定義程式碼段(相容UWP和WPF)

1. 前言 之前介紹過依賴屬性和附加屬性的程式碼段,這兩個程式碼段我用了很多年,一直都幫了我很多。不過這兩個程式碼段我也多年沒修改過,Resharper老是提示我生成的程式碼可以修改,它這麼有誠意,這次就只好從了它,順便簡單介紹下怎麼自定義程式碼段。 2. VisualStudio自帶程式碼段的問題 以

Spring使用註解的方式配置bean屬性-bean之間的引用關係

  前邊我們講過了使用註解的方式來為類建立一個bean的例項,使其被SpringIOC容器管理。即先使用註解標註在類上,然後使用<context:component-san>標籤指定Spring掃描的包及其子包的類。下邊我們來講一講如何使用註解的方式來為bean

Spring 註解實現Bean依賴注入之@Qualifier

三、@Qualifier:限定描述符,用於細粒度選擇候選者; @Autowired預設是根據型別進行注入的,因此如果有多個型別一樣的Bean候選者,則需要限定其中一個候選者,否則將丟擲異常 @Qualifier限定描述符除了能根據名字進行注入,更能進行更細粒度的控制如何選擇

Spring 註解實現Bean依賴注入之@Required

對應於基於XML配置中的依賴檢查,但XML配置的依賴檢查將檢查所有setter方法; 基於@Required的依賴檢查表示註解的setter方法必須,即必須通過在XML配置中配置setter注入,如果沒有配置,在容器啟動時會丟擲異常,從而保證在執行時不會遇到空指標異常,@Required只能放置在set

利用java反射實現兩個具有相同屬性bean賦值

import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用於賦值的實體類

javax.el.PropertyNotFoundException: Property 'XXX' not found on type bean.XXXXX

遇到的問題: 在使用Eclipse開發Java Web時,呼叫DAO和Java Bean出現瞭如下錯誤: 嚴重: Servlet.service() for servlet [com.servlet.queryServlet] in context with path [

轉--解決Spring中singleton的Bean依賴於prototype的Bean的問題

原文連結:https://my.oschina.net/itblog/blog/205860 scope="prototype"沒寫的問題,專案中對一個表的增刪該操作是用一個action,這個actionadd,update,delete,save這些方法, 新增和修改是共

Spring4 實戰筆記(1):裝配bean依賴注入的本質

這種字串形式的表示雖然可以,但是不具備“型別安全”,因此Spring也提供了更加型別安全的機制,即通過類或者介面來設定掃描機制的目標目錄,例如: @Configuration @ComponentScan(basePackageClasses = {CDPlayer.class, DVDPlayer.cl

kafka告警簡單方案 依賴配置中心實現注有@ConfigurationProperties的bean相關屬性重新整理 簡單封裝kafka相關的api

一、前言   為什麼要設計kafka告警方案?現成的監控專案百度一下一大堆,KafkaOffsetMonitor、KafkaManager、 Burrow等,具體參考:kafka的訊息擠壓監控。由於本小組的專案使用的kafka叢集並沒有被公司的kafka-manager管理,所以只能自己簡單做一個告警。

依賴配置中心實現注有@ConfigurationProperties的bean相關屬性重新整理

配置中心是什麼   配置中心,通過key=value的形式儲存環境變數。配置中心的屬性做了修改,專案中可以通過配置中心的依賴(sdk)立即感知到。需要做的就是如何在屬性發生變化時,改變帶有@ConfigurationProperties的bean的相關屬性。 配置中心原理   在讀配置中心原始碼的時候發

spring ioc中例項化bean以及依賴注入bean和基本型別屬性簡單實現方案

Spring兩個重要特性IOC和AOP,本文中簡單實現bean的建立以及屬性依賴注入。 實現步驟如下: 1、通過dom4j解析bean.xml檔案,將bean物件以及依賴屬性裝入List。 2、遍歷list,通過反射機制例項化物件。 3、遍歷list,通過反射呼叫bean裡

Spring記錄之Bean屬性配置、依賴關係及生命週期

Spring配置Bean的屬性和依賴關係 Spring的IOC容器負責管理所有的應用系統元件,並協助元件之間建立關聯。 Spring支援Properties檔案格式,和XML檔案配置,XML是常用的。 設定普通屬性值(設值注入) 當bean例項建立以後,

數據庫學習筆記_10_函數依賴詳解——函數依賴公理及其推得規律和屬性閉包

一個 說明 tro ans while 比較 接下來 子集 and 首先引入armstrong‘s axioms, 反射律(reflexivity rule)對於任何為LA(a)子集的LA(b)來說,LA(a)->LA(b)恒成立 增加律(argu

什麽是依賴屬性?(在練習使用StoryBoard故事板時,遇到的問題)

sdn targe context 樣式設置 動態更新 註冊 log 然而 change 概述: Windows Presentation Foundation (WPF) 提供了一組服務,這些服務可用於擴展公共語言運行時 (CLR) 屬性的功能。這些服務通常統稱為 WPF

利用反射操作bean屬性和方法

兩個 決定 dto epo cts 強制 多選 通過 報表 今天在開發中碰到這樣一個場景:當請求添加項目下的目錄時,傳過來的是一個IndexModel,這個Model裏有關於這個目錄字段的詳細信息,包括基礎報表,實時,漏鬥等信息(這些字段類型都是boolean),對應於頁面