Spring@Autowired注解與自動裝配


1 配置文件的方法

我們編寫spring框架的代碼時候。一直遵循是這樣一個規則:所有在spring中注入的bean都建議定義成私有的域變量。並且要配套寫上get和set方法。
Boss擁有Office和Car類型的兩個屬性:

我們在Spring容器中將Office和Car聲明為Bean,並注入到Boss Bean中,下面是使用傳統XML完成這個工作的配置文件beans.xml:   

當我們運行以下代碼時,控制台將正確打出boss的信息:

 

2 @Autowired的使用

Spring 2.5引入了@Autowired注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。通過@Autowired的使用來消除set,get方法。
下面是@Autowired的定義:

注意:@Autowired注解能夠作用於構建器、屬性、方法。這里的方法不局限於設值方法,即setter方法,常見的各種方法都可以應用這一注解。
要使用@Autowired實現我們要精簡程序的目的,需要這樣來處理: 
在applicationContext.xml中加入: 
  <!-- 該 BeanPostProcessor 將自動對標注 @Autowired 的 Bean 進行注入 -->   
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
Spring通過一個BeanPostProcessor對@Autowired進行解析,所以要讓@Autowired起作用必須事先在Spring容器中聲明AutowiredAnnotationBeanPostProcessor Bean。   
修改在原來注入Spirng容器中的bean的方法,在域變量上加上標簽@Autowired,並且去掉相應的get和set方法。
使用 @Autowired 注釋的 Boss.java

在applicatonContext.xml中把原來引用的<porpery>標簽也去掉。

這樣,當 Spring容器啟動時,AutowiredAnnotationBeanPostProcessor將掃描Spring容器中所有Bean,當發現Bean中擁有@Autowired 注釋時就找到和其匹配(默認按類型匹配)的Bean,並注入到對應的地方中去。  

3 @Autowired注入規則

@Autowired默認是按照byType進行注入的,但是當byType方式找到了多個符合的bean,又是怎么處理的?Autowired默認先按byType,如果發現找到多個bean,則又按照byName方式比對,如果還有多個,則報出異常。
例子:
@Autowired
private Car redCar;
1. spring先找類型為Car的bean
2. 如果存在且唯一,則OK;
3. 如果不唯一,在結果集里,尋找name為redCar的bean。因為bean的name有唯一性,所以,到這里應該能確定是否存在滿足要求的bean了
@Autowired也可以手動指定按照byName方式注入,使用@Qualifier標簽,例如:
@Autowired()
@Qualifier("baseDao" )
因為bean的name具有唯一性,理論上是byName會快一點,但spring默認使用byType的方式注入。另外補充一點:@Resource(這個注解屬於J2EE的)的標簽,默認是按照byName方式注入的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM