Spring主要提供以下兩種方法用于依賴注入
基于屬性Setter方法注入
基于構造方法注入
例子:


如上Communication類有一個messaging屬性,并含有setMessaging方法,那麼使用Setter方法注入的時候,隻需要使用如下XML配置即可:


這裡省略了ActiveMQMessaging的定義,實際上ActiveMQMessaging類是<code>Messaging</code>接口的一個實作類。
例子


注意以上Communication類有一個構造方法Communication(Encryption encryption),且含有一個入參,類型為Encryption,那麼使用構造方法注入的時候,XML配置如下:


注意,這裡省略了RSAEncryption的定義,不用在意這些細節,該類是<code>Encryption</code>接口的一個實作類。
另外,為了避免構造方法重載帶來的歧義,這裡指定了入參類型為com.websystique.spring.domain.Encryption。
bean的裝配有兩種方式,手動裝配和自動裝配。注意,不要混淆,bean的裝配是依賴注入的具體行為,依賴注入的時候需要根據bean的名稱或類型等進行裝配。
手動裝配:通過在<property> 或者 <constructor>标簽中使用ref屬性,在上一小節的“依賴注入”部分使用的就是手動裝配;


自動裝配:在<bean>标簽中使用<code>autowire</code>屬性;
本小節主要關注自動裝配,自動裝配有以下四種方式:
<code>autowire="byName"</code> : 根據名稱
<code>autowire="byType"</code> : 根據類型
<code>autowire="constructor"</code> : 根據構造方法入參類型
<code>autowire="no"</code> : 不使用自動裝配,即預設方式,手動裝配


該類有一個屬性叫<code>applicationUser</code>,那麼根據名稱自動裝配的XML配置如下:




該類有一個屬性類型為<code></code>EmployeeAddress<code></code>,那麼根據類型自動裝配的XML配置如下:




該類有一個構造方法,入參的類型為Instrument<code></code>,那麼根據構造方法自動裝配的XML配置如下:




該類有一個屬性license,由于我們不打算使用自動裝配功能,那麼隻能使用手動裝配了,XML配置如下:


注意,如果不配置license的ref引用的話,license将為null。
主要涉及以下三個注解
<code>@Autowired</code>
<code>@Resource</code>
<code>@Qualifier</code>
@Autowired可應用于構造方法、屬性、setter方法或配置類@Configuration的方法上,該注解根據bean的資料類型進行裝配,如果你想希望根據bean的名稱進行裝配可以使用帶name屬性的<code>@Resource</code>注解;另外<code>@Qualifier</code>注解經常與@Autowired注解結合使用,用于解決一個應用中存在多個同種類型的bean的情況,下面将給出各個注解的示例。
setter方法上


構造方法上


屬性上




例子背景::存在兩個Car接口的實作類,其中一個Car接口的實作類已被注冊為bean,且name為Mustang


注意,以上例子如果不使用<code></code><code>@Qualifier</code>限定的話,将抛出如下異常,表明存在多個類型相同的bean:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.websystique.spring.domain.Car] is defined: expected single matching bean but found 2: Ferari,Mustang
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:970)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 14 more
最後提醒下,被@Autowired注解标注預設情況下能保證成功注入,如果注入不成功(往往是找不到,或存在歧義),Spring會抛出異常。當然,有時候可能會有特殊需求,不希望bean被強制裝配,那麼可以在@Autowired上添加<code>required=</code><code>false</code>屬性,表明該bean的裝配是可選的,找不到的話,就為null吧,如下示例:


基于以上原因,雖然@Autowired注解與@Resource功能類似,但是@Autowired還是比@Resource強大了那麼一點點,個人建議使用@Autowired注解。
本文轉自風一樣的碼農部落格園部落格,原文連結:http://www.cnblogs.com/chenpi/p/6222595.html,如需轉載請自行聯系原作者