1. 程式人生 > >Spring依賴注入的普通方式和註解方式

Spring依賴注入的普通方式和註解方式

純屬自己的筆記本,方便複習用

Spring主要作用就是為程式碼“解耦”,降低程式碼間的耦合度

spring注入是指在啟動spring容器載入bean的時候,完成對變數的賦值行為

第一種:

在建立Product的時候注入一個Category物件  這裡為什麼要把Category注入到Product呢?就是把這類商品的共性注入到商品中

就好像人類和我,需要把人的共性注入給我
注意,這裡要使用ref來注入另一個物件         

第二種:使用註解的方式來注入物件

首先要在applicationcontext.xml中告訴spring 用註解的方式來進行配置了,當spring容器啟動時,<context:annotation-config/>會掃描spring容器中所有的bean,當發現 Bean 中擁有 @Autowired 註釋時就找到和其匹配(預設按型別匹配)的 Bean,並注入到對應的地方中去。   

 在Product.java的category屬性前加上@Autowired註解

除了@Autowired之外,@Resource也是常用的手段   只不過註解@Resource 是按照名稱來進行裝配,而@Autowired 則是按照型別來進行裝配。如果使用@Autowired時也希望可以新增一個 @Qualifier 註解解決

如果用@Resource進行依賴注入,它先會根據指定的name屬性去Spring容器中尋找與該名稱匹配的型別,例如:@Resource(name="c"),如果沒有找到該名稱,則會按照型別去尋找,找到之後,會對欄位userDao進行注入。

通常我們使用@Resource。@Resource 註解是 J2EE 提供的, 而 @Autowried 是 Spring 提供的,如果想減少對 Spring 的依賴建議使用 @Resource 方法。@Resource 和 @Autowried 都可以加在欄位的 setter 方法上。

 @Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
  @Resource裝配順序
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常
  2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常
  3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;

 除了前面的 在屬性前加上@Autowired 這種方式外,也可以在setCategory方法前加上@Autowired,這樣來達到相同的效果

 配置後,Spring 將直接採用 Java 反射機制對@Autowired標註的私有成員變數進行自動注入。