spring裝配與Autowired自動裝備

**首先,確定一下

裝配的概念

。**

《spring實戰》中給裝配下了一個定義:創建應用對象之間協作關係的行爲稱爲裝配。也就是說當一個對象的屬性是另一個對象時,實例化時,需要爲這個對象屬性進行實例化。這就是裝配。如果一個對象只通過接口來表明依賴關係,那麼這種依賴就能夠在對象本身毫不知情的情況下,用不同的具體實現進行切換。但是這樣會存在一個問題,在傳統的依賴注入配置中,我們必須要明確要給屬性裝配哪一個bean的引用,一旦bean很多,就不好維護了。基於這樣的場景,spring使用註解來進行自動裝配,解決這個問題。自動裝配就是開發人員不必知道具體要裝配哪個bean的引用,這個識別的工作會由spring來完成。與自動裝配配合的還有“自動檢測”,這 個動作會自動識別哪些類需要被配置成bean,進而來進行裝配。這樣我們就明白了,自動裝配是爲了將依賴注入“自動化”的一個簡化配置的操作。

@Autowired這個是自動裝配,是爲了避免繁瑣的xml配置而設計的,實現很簡單,就是根據註解生成beanfactory的匹配規則,有幾種規則,但有一些缺點,給你一些我曾經的筆記吧,帶譯文。自動掃描裝配Bean今天來整理一下Spring的自動裝配 autowire一節,在這裏我們要解決以下問題:
§1 什麼是自動裝配?
§2 自動裝配的意義?
§3 自動裝配有幾種類型?
§4 如何啓用自動裝配?

§1 什麼是自動裝配?
引用 Spring IoC容器可以自動裝配(autowire)相互協作bean之間的關聯關係。因此,如果可能的話,可以自動讓Spring通過檢查BeanFactory中的內容,來替我們指定bean的協作者(其他被依賴的bean)。 簡而言之,就是對於bean當中引用的其他bean不需要我們自己去配置它改使用哪個類,Spring 的自動裝配可以幫助我們完成這些工作

§2 自動裝配的意義?

其中優點包括:
自動裝配能顯著減少配置的數量。不過,採用bean模板(見這裏)也可以達到同樣的目的。 自動裝配可以使配置與java代碼同步更新。例如,如果你需要給一個java類增加一個依賴,那麼該依賴將被自動實現而不需要修改配置。因此強烈推薦在開發過程中採用自動裝配,而在系統趨於穩定的時候改爲顯式裝配的方式。

§3 自動裝配有幾種類型? .

模式 說明 no 默認不使用autowiring。 必須顯示的使用”“標籤明確地指定bean合,對於部署給予更大的 控制和明瞭。

- byName
根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性完全一致的bean,並將其與屬性自 動裝配。例如,在bean定義中將 autowire設置爲by name,而該bean包含master屬性(同時提供 setMaster(..)方法),Spring就會查找名爲master的bean定義,並用它來裝配給master屬性。

- byType
如果容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配。如果存在多個該類型的 bean,那麼將會拋出異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean, 則什麼事都不發生,屬性也不會被設置。如果你不希望這樣,那麼可以通過設置 dependency-check=”objects”讓Spring拋出異常。

- constructor
與byType的方式類似,不同之處在於它應用於構造器參數。如果在容器中沒有找到與構造器參數類
型一致的bean,那麼將會拋出異常。

- autodetect
通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。
如果發現默認的構造器,那麼將使用byType方式。

§4 如何啓用自動裝配?
你可以參照以下的配置去啓用自動裝配 引用

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" default-autowire="byType" > 

當然,這裏的byType你可以更改爲其他你想要的裝配類型。

§5 自動裝配將引發的問題?
自動裝配的一些缺點: 儘管自動裝配比顯式裝配更神奇,但是,正如上面所提到的,Spring會盡量避免在裝配不明確的時候進行猜測,因爲裝配不明確可能出現難以預料的結果,而且Spring所管理的對象之間的關聯關係也不再能清晰的進行文檔化。 對於那些根據Spring配置文件生成文檔的工具來說,自動裝配將會使這些工具沒法生成依賴信息。 自動裝配可以減輕配置的工作量,但同時使得配置文件的可讀性變得很差,因爲你不可能從配置文件中獲知這些對象之間得依賴關係,從而維護困難! 注意: 當根據類型進行自動裝配的時候,容器中可能存在多個bean定義跟自動裝配的setter方法和構造器參數類型匹配。這樣就會存在模棱兩可的問題。如果bean定義不唯一,裝配時就會拋出異常。
解決方法

  1. 通過設定bean定義中的’autowire-candidate’屬性顯式的設置爲’true’ 或 ‘false’來設置其是否爲被自動裝配 對象。

  2. 使用對bean名字進行模式匹配來對自動裝配進行限制,其做法是在元素的 ‘default-autowire-candidates’ 屬性中進行設置。可以使用通配符,如以’Repository’結尾的bean, 那麼可以設置爲”*Repository“。

  3. 通過在bean定義中設置’primary’屬性爲’true’來將該bean設置爲首選自動裝配bean。 如何使用Spring autowire請取決於你的項目設計。

自動裝配的四種註解

常用的自動裝配註解有以下幾種:

  • @Autowired
  • @Resource
  • @Inject
  • @Qualifier
  • @Named

    @Autowired註解是byType類型的,這個註解可以用在屬性上面,setter方面上面以及構造器上面。使用這個註解時,就不需要在類中爲屬性添加setter方法了。但是這個屬性是強制性的,也就是說必須得裝配上,如果沒有找到合適的bean能夠裝配上,就會拋出異常。這時可以使用required=false來允許可以不被裝配上,默認值爲true。當required=true時,@Autowired要求必須裝配,但是在沒有bean能裝配上時,就會拋出異常NoSuchBeanDefinitionException,如果required=false時,則不會拋出異常。另一種情況是同時有多個bean是一個類型的,也會拋出這個異常。此時需要進一步明確要裝配哪一個Bean,這時可以組合使用@Qualifier註解,值爲Bean的名字即可。@Qualifier註解使用byName進行裝配,這樣可以在多個類型一樣的bean中,明確使用哪一個名字的bean來進行裝配。@Qualifier註解起到了縮小自動裝配候選bean的範圍的作用。注意:@Autowired註解是spring提供的,所以會依賴spring的包。還有一個byType的註解@Inject,與@Autowired註解作用一樣,也是byType類型,而且是Java ee提供的,完全可以代替@Autowired註解,但是@Inject必須是強制裝配的,沒有required屬性,也就是不能爲null,如果不存在匹配的bean,會拋出異常。@Autowired與@Qualifier可以組合使用,@Inject也有一個組合的註解,就是@Named註解,與@Qualifier作用一樣,也byName,但是不是spring的,是java ee標準的。這樣就出現了兩套自動裝配的註解組合,@Autowired與@Qualifier是spring提供的@Inject與@Named是Java EE的。但是@Qualifier註解在java ee中也有一樣,作用與spring的@Qualifier註解一模一樣,只是所在的包不一樣。不過建議大家使用spring的。最後還有一個@Resouce註解, 這個註解也是Java ee的,也是byName類型的,原理同@Qualifier和@Named是一樣的。
    舉例:

@Autowired
@Qualifier("iceCream")
<!-- 要裝配的bean的名字爲iceCream 默認爲類名首字母小寫-->
public void setDessert(Dessert dessert){
    this.desert=desert
}

依賴注入與裝配

依賴注入的本質就是裝配,裝配是依賴注入的具體行爲。

依賴注入不是目的,它是一系列工具和手段,最終的目的是幫助我們開發出鬆散耦合(loose coupled)、可維護、可測試的代碼和程序。這條原則的做法是大家熟知的面向接口,或者說是面向抽象編程。

依賴注入有兩種形式:構造器注入和setter注入
1.構造器注入對象屬性

<bean id="text" class="com.maven.Text" />
        <bean id="hello" class="com.maven.Hello"><constructor-arg ref="text" /></bean>

2.屬性注入對象屬性

  <bean id="hello" class="com.maven.Hello">
      <property name="text" ref="text" />
  </bean>

3 屬性爲List類型或數組類型屬性注入

<bean id="hello" class="com.maven.Hello">
     <property name="persons">
           <list>
               <ref bean="zhangsan" />
               <ref bean="zhangsan" />
           </list>
     </property>
</bean>
 list元素的成員也可以是<value><bean><null />,其中<bean>是用來裝配匿名bean的,<null />是用來裝配null值的。匿名bea
n會在下面介紹。

4.屬性爲set類型的屬性注入
set類型與list類型注入是一樣的,只是標籤改成就可以了。並且裏面的元素是不能重複的。

5.屬性爲map類型的屬性注入

<bean id="hello" class="com.maven.Hello">
      <property name="article">
          <map>
              <entry key="title" value-ref="text" />
              <entry key="title" value-ref="text" />
          </map>
      </property>
</bean>

6.屬性爲Properties類型的屬性注入

<bean id="hello" class="com.maven.Hello">
   <property name="article">
       <props>
            <prop key="title">I LOVE YOU</prop>
            <prop key="title">I HATE YOU</prop>
       </props>
   </property>
</bean

結合http://blog.csdn.net/u012843873/article/details/52399206
https://www.zhihu.com/question/19719092
http://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html

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