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的配置檔案中配置開啟註解掃描。
其次,在配置檔案中開啟<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>
總結:以上幾種物件的注入方式在通常情況下,用第一種、第二種和第三中的情況較多。大部分專案都是用註解方式。所以別的幾種注入方式很多人還不是很瞭解,希望通過以上總結共同提高。