1. 程式人生 > >spring中依賴注入方式總結

spring中依賴注入方式總結

文章來源於今日頭條使用者:分散式系統架構

一、註解注入

註解注入在Spring中是用的最多的一種方式,就是在java程式碼中使用註解的方式進行裝配,在程式碼中加入@Resource或者@Autowired、

1、Autowired是自動注入,自動從spring的上下文找到合適的bean來注入

2、Resource用來指定名稱注入

3、Qualifier和Autowired配合使用,指定bean的名稱

4、Service,Controller,Repository分別標記類是Service層類,Controller層類,資料儲存層的類,spring掃描註解配置時,會標記這些類要生成bean。

5、Component是一種泛指,標記類是元件,spring掃描註解配置時,會標記這些類要生成bean。

  • 上面的Autowired和Resource是用來修飾字段,建構函式,或者設定方法,並做注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。

舉例:在類SpringAction中要依賴物件SpringDao類的物件,那麼我們可以按照如下進行註解配置:

public class SpringAction { 
 //注入物件springDao 
 @Autowired
 private SpringDao springDao; 
 } 

在類中光使用註解還不能完全的實現依賴的注入,還需要的spring的配置檔案中配置開啟註解掃描。

spring中依賴注入方式總結

 

其次,在配置檔案中開啟<context:annotation-config>節點,告訴Spring容器可以用註解的方式注入依賴物件;其在配置檔案中的程式碼如下

 <!-- bean annotation driven -->
 <context:annotation-config />
 <context:component-scan base-package="cn.outofmemory.helloannotation" >
 </context:component-scan>

二、構造器注入

構造器注入指的是在類中構造帶引數的構造方法實現類的注入,舉例:在類SpringAction中要依賴兩個物件SpringDao和User類的物件,那麼我們就可以在SpringAction中進行構造器注入,也就是說在建立SpringAction物件時要將SpringDao和User兩個引數值傳進來:

public class SpringAction { 
 //注入物件springDao 
 private SpringDao springDao; 
 private User user; 
 //構造器
 public SpringAction(SpringDao springDao,User user){ 
 this.springDao = springDao; 
 this.user = user; 
 System.out.println("構造方法呼叫springDao和user"); 
 } 
 
 public void save(){ 
 user.setName("xxxxx"); 
 springDao.save(user); 
 } 
 } 

在XML檔案就要配置<bean>配置,使用<constructor-arg>標籤,ref屬性同樣指向其它<bean>標籤的name屬性如下程式碼所示:

<!--配置bean,配置後該類由spring管理-->
<bean name="springAction" class="com.guage.springdemo.action.SpringAction"> 
<!--(2)建立構造器注入,如果主類有帶參的構造方法則需新增此配置-->
<constructor-arg ref="springDao"></constructor-arg> 
<constructor-arg ref="user"></constructor-arg> 
</bean> 
<bean name="springDao" class="com.guage.springdemo.dao.impl.SpringDaoImpl"></bean> 
 <bean name="user" class="com.guage.springdemo.vo.User"></bean>

完成以上配置就可以在專案啟動後直接使用private SpringDao springDao;

private User user這兩個物件了。

但是如果遇到構造方法傳入的兩引數都是同類型的,為了分清哪個該賦對應值,則需要進行一些小處理:

下面是設定index,就是引數位置:

<bean name="springAction" class="com.guage.springdemo.action.SpringAction"> 
<constructor-arg index="0" ref="springDao"></constructor-arg> 
<constructor-arg index="1" ref="user"></constructor-arg> 
</bean>

以上就spring中構造注入的大致用法,具體細節配置還需要大家查詢spring官網技術文件。

三、set注入

使用屬性的setter方法注入

setter注入指的是在類中加入setter方法實現類的注入,舉例:在類SpringAction中要依賴兩個物件SpringDao類的物件。首先要配置被注入的bean,在該bean對應的類中,應該有要注入的物件屬性或者基本資料型別的屬性。類中需要例項化一個SpringDao物件,那麼就可以定義一個private的SpringDao成員變數,然後建立SpringDao的set方法(這是ioc的注入入口):

public class SpringAction { 
 //注入物件springDao 
 private SpringDao springDao; 
 //一定要寫被注入物件的set方法 
 public void setSpringDao(SpringDao springDao) { 
 this.springDao = springDao; 
 } 

在XML檔案就要配置<bean>配置

<!--配置bean,配置後該類由spring管理-->
<bean name="springAction" class="com.guage.springdemo.action.SpringAction"> 
 <!--(1)依賴注入,配置當前類中相應的屬性-->
 <property name="springDao" ref="springDao"></property> 
 </bean> 
<bean name="springDao" class="com.guage.springdemo.dao.impl.SpringDaoImpl">
</bean> 

<bean>中的name屬性是class屬性的一個別名,class屬性指類的全名,因為在SpringAction中有一個公共屬性Springdao,所以要在<bean>標籤中建立一個<property>標籤指定SpringDao。<property>標籤中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,這樣其實是spring將SpringDaoImpl物件例項化並且呼叫SpringAction的setSpringDao方法將SpringDao注入.

以上就是一個使用屬性的setter方法的方式進行依賴注入

四、靜態工廠的方法注入

靜態工廠顧名思義,就是通過呼叫靜態工廠的方法來獲取自己需要的物件,為了讓spring管理所有物件,我們不能直接通過"工程類.靜態方法()"來獲取物件,而是依然通過spring注入的形式獲取:

package com.guage.springdemo.factory; 
import com.guage.springdemo.dao.FactoryDao; 
import com.guage.springdemo.dao.impl.FactoryDaoImpl; 
import com.guage.springdemo.dao.impl.StaticFacotryDaoImpl; 
public class DaoFactory { 
 //靜態工廠 
 public static final FactoryDao getStaticFactoryDaoImpl(){ 
 return new StaticFacotryDaoImpl(); 
 } 
}

同樣看關鍵類,這裡我需要注入一個FactoryDao物件,這裡看起來跟第一種注入一模一樣,但是看隨後的xml會發現有很大差別:

public class SpringAction { 
 //注入物件 
 private FactoryDao staticFactoryDao; 
 
 public void staticFactoryOk(){ 
 staticFactoryDao.saveFactory(); 
 } 

//注入物件的set方法

 public void setStaticFactoryDao(FactoryDao staticFactoryDao) { 
 this.staticFactoryDao = staticFactoryDao; 
 } 
} 

Spring的IOC配置檔案,注意看<bean name="staticFactoryDao">指向的class並不是FactoryDao的實現類,而是指向靜態工廠DaoFactory,並且配置 factory-method="getStaticFactoryDaoImpl"指定呼叫哪個工廠方法:

<!--配置bean,配置後該類由spring管理-->
<bean name="springAction" class="com.guage.springdemo.action.SpringAction" > 
 <!--(3)使用靜態工廠的方法注入物件,對應下面的配置檔案(3)-->
 <property name="staticFactoryDao" ref="staticFactoryDao"></property> 
 </property> 
 </bean> 
 <!--(3)此處獲取物件的方式是從工廠類中獲取靜態方法-->
<bean name="staticFactoryDao" class="com.guage.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>

五、動態工廠的方式注入

與靜態工廠方式注入的方法不同,它需要先建立工廠類再呼叫方法

public class IOCFactory {
public IOCdependency getFactory(){
return new IOCdependency();
}
}

這裡也需要set方法

// 第四種方式,實體工廠方式,在工廠類中返回實體IOCFactory物件

public void setIOCdependency(IOCdependency iocdenpendency) {
this.IOCdependency = iocdenpendency; }

與靜態工廠的方法不同,這裡需要定義IOCdependency的bean,並指定factory-bean和factory-method

<!-- 第四種方法,實體工廠方法 -->
<bean id="IOCMain" class="com.elish.model.IOCMain">
<!-- 使用例項工廠的方法注入物件,對應下面的配置檔案 -->
<property name="IOCdependency" ref="IOCdependency"></property>
</bean>
<!-- 此處獲取物件的方式是從工廠類中獲取例項方法 -->
<bean name="IOCFactory" class="com.elish.model.IOCFactory"></bean>
<bean name="IOCdependency" factory-bean="IOCFactory"
factory-method="getFactory"></bean>

總結:以上幾種物件的注入方式在通常情況下,用第一種、第二種和第三中的情況較多。大部分專案都是用註解方式。所以別的幾種注入方式很多人還不是很瞭解,希望通過以上總結共同提高。