Spring依賴注入的四種方式(重點是註解方式)
在Spring容器中為一個bean配置依賴注入有三種方式:
· 使用屬性的setter方法注入 這是最常用的方式;
· 使用構造器注入;
· 使用Filed注入(用於註解方式).
使用屬性的setter方法注入
首先要配置被注入的bean,在該bean對應的類中,應該有要注入的物件屬性或者基本資料型別的屬性。例如:為UserBiz類注入UserDAO,同時為UserBiz注入基本資料型別String,那麼這時,就要為UserDAO物件和String型別設定setter方法.,用於進行依賴注入。
如何配置該bean呢?
<bean id="userBiz" class="com.text.biz.impl.UserBizImpl"> <property name="userDao"> <ref>userDao</ref> </property> </bean>
以上就是一個使用屬性的setter方法的方式進行依賴注入。
使用構造器注入
第一,在PersonBiz類中注入PersonDAO和一個String型別的資料;在該類中,不用為PersonDAO屬性和String資料型別的屬性設定setter方法,但是需要生成該類的構造方法;如下:
public class PersonBizImpl implements PersonBiz { // 宣告"依賴物件"PersonDAO PersonDAO personDao = null; // 宣告"依賴的基本資料型別" String str = null; // 生成無參構造方法 public PersonBizImpl() { super(); } // 生成帶參構造方法 public PersonBizImpl(PersonDAO personDao, String str) { super(); this.personDao = personDao; this.str = str; } public void addPerson() { this.personDao.addPerson(); System.out.println(str); } }
第二,在配置檔案中配置該類的bean,並配置構造器,在配置構造器中用到了<constructor-arg>節點,該節點有四個屬性:
· index是索引,指定注入的屬性,從0開始,如:0代表personDao,1代表str屬性;
· type是指該屬性所對應的型別,如Persondao對應的是com.aptech.dao.PersonDAO;
· ref 是指引用的依賴物件;
· value 當注入的不是依賴物件,而是基本資料型別時,就用value;
如下:
<!-- 利用構造器配置依賴注入 --> <bean id="personDao" class="com.aptech.dao.impl.PersonDAOImpl"></bean> <bean id="personBiz" class="com.aptech.biz.impl.PersonBizImpl"> <constructorarg index="0" type="com.aptech.dao.PersonDAO"ref="personDao"></constructor-arg> <constructor-arg index="1" value="Spring學習"></constructor-arg> </bean>
使用欄位(Filed)注入(用註解方式)
在Spring中,注入依賴物件可以採用手工裝配或自動裝配,在實際應用開發中建議使用手工裝配,因為自動裝配會產生許多未知情況,開發人員無法預見最終的裝配結果。
手工裝配依賴物件又分為兩種方式:
一種是在XML檔案中,通過在bean節點下配置;如上面講到的使用屬性的setter方法注入依賴物件和使用構造器方法注入依賴物件都是這種方式。
另一種就是在java程式碼中使用註解的方式進行裝配,在程式碼中加入@Resource或者@Autowired、
- Autowired是自動注入,自動從spring的上下文找到合適的bean來注入
- Resource用來指定名稱注入
- Qualifier和Autowired配合使用,指定bean的名稱,如
@Autowired @Qualifier("userDAO") private UserDAO userDAO;
怎樣使用註解的方式來為某個bena注入依賴物件呢?
首先,我們需要在Spring容器的配置檔案applicationContext.Xml檔案中配置以下資訊,該信心是一個Spring配置檔案的模板:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
</beans>
注意:只有配置了紅色部分的程式碼才可以引入註解的名稱空間,否則報錯。 以上的配置隱式的註冊了多個對註釋進行解析的處理器:AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor等。
其次,在配置檔案中開啟<context:annotation-config>節點,告訴Spring容器可以用註解的方式注入依賴物件;其在配置檔案中的程式碼如下:
<beans>
……
<context:annotation-config></context:annotation-config>
……
</beans>
第三,在配置檔案中配置bean物件,如下:
<bean id="userDao" class="com.springtest.dao.impl.UserDAOImpl"></bean>
<bean id="userBiz" class="com.springtest.biz.impl.UserBizImpl"></bean>
第四,在需要依賴注入的BIZ類中,宣告一個依賴物件,不用生成該依賴物件的setter方法,並且為該物件添加註解:
public class UserBizImpl implements UserBiz {
@Resource(name="userDao")
private UserDAO userDao = null;
public void addUser() {
this.userDao.addUser();
}
}
其中,在Java程式碼中可以使用@Autowired或@Resource註解方式進行Spring的依賴注入。兩者的區別是:@Autowired預設按型別裝配,@Resource預設按名稱裝配,當找不到與名稱匹配的bean時,才會按型別裝配。
比如:我們用@Autowired為上面的程式碼UserDAO介面的例項物件進行註解,它會到Spring容器中去尋找與UserDAO物件相匹配的型別,如果找到該型別則將該型別注入到userdao欄位中;
如果用@Resource進行依賴注入,它先會根據指定的name屬性去Spring容器中尋找與該名稱匹配的型別,例如:@Resource(name="userDao"),如果沒有找到該名稱,則會按照型別去尋找,找到之後,會對欄位userDao進行注入。
通常我們使用@Resource。
使用註解注入依賴物件不用再在程式碼中寫依賴物件的setter方法或者該類的構造方法,並且不用再配置檔案中配置大量的依賴物件,使程式碼更加簡潔,清晰,易於維護。
在Spring IOC程式設計的實際開發中推薦使用註解的方式進行依賴注入。