Spring中依賴注入的四種方式

在Spring容器中爲一個bean配置依賴注入有三種方式:java

· 使用屬性的setter方法注入  這是最經常使用的方式;spring

· 使用構造器注入;編程

· 使用Filed注入(用於註解方式).app

 

使用屬性的setter方法注入學習

首先要配置被注入的bean,在該bean對應的類中,應該有要注入的對象屬性或者基本數據類型的屬性。例如:爲UserBiz類注入UserDAO,同時爲UserBiz注入基本數據類型String,那麼這時,就要爲UserDAO對象和String類型設置setter方法.,用於進行依賴注入。this

如何配置該bean呢?spa

<bean id="userBiz" class="com.text.biz.impl.UserBizImpl">.net

<property name="userDao">xml

<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

怎樣使用註解的方式來爲某個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編程的實際開發中推薦使用註解的方式進行依賴注入。

    依賴注入—自動裝配

Spring中提供了自動裝配依賴對象的機制,可是在實際應用中並不推薦使用自動裝配,由於自動裝配會產生未知狀況,開發人員沒法預見最終的裝配結果。

自動裝配是在配置文件中實現的,以下:

<bean id="***" class="***" autowire="byType">

只須要配置一個autowire屬性便可完成自動裝配,不用再配置文件中寫<property>,可是在類中仍是要生成依賴對象的setter方法。

Autowire的屬性值有以下幾個:

· byType 按類型裝配  能夠根據屬性類型,在容器中尋找該類型匹配的bean,若有多個,則會拋出異常,若是沒有找到,則屬性值爲null;

· byName 按名稱裝配  能夠根據屬性的名稱在容器中查詢與該屬性名稱相同的bean,若是沒有找到,則屬性值爲null;

· constructor 與byType方式類似,不一樣之處在與它應用於構造器參數,若是在容器中沒有找到與構造器參數類型一致的bean,那麼將拋出異常;

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

相關文章
相關標籤/搜索