Spring 依賴注入的三種形式
第一種:構造函數注入
-
所使用標籤:constructor-arg
-
標籤出現的位置:bean標籤的內部
-
標籤中的屬性:
- type:用於指定要注入的數據的數據類型,該數據類型也是構造函數中某個或某些參數的類型
- index:用於指定要注入的數據給構造函數中指定索引位置的參數賦值。索引的位置是從0開始
- name:用於指定給構造函數中指定名稱的參數賦值 ---------------- 常用的
以上三個屬性用於指定給構造函數中哪個參數賦值,以下兩個用於賦值 - value:用於提供基本類型和String類型的數據
- ref:用於指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
-
優勢:
在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功。 -
弊端:
改變了bean對象的實例化方式,使我們在創建對象時,如果用不到這些數據,也必須提供。
<bean id="accountService" class="com.msg.service.AccountServiceImpl">
<constructor-arg name="name" value="泰斯特"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!-- 配置一個日期對象以供birthday屬性引用 -->
<bean id="now" class="java.util.Date"></bean>
第二種:set方法注入
(相比於構造函數注入,set方式注入更爲常用)
- 所使用標籤:property
- 標籤出現的位置:bean標籤的內部
- 標籤中的屬性與使用方法:
- name:用於指定注入時所調用的set方法名稱
- value:用於提供基本類型和String類型的數據
- ref:用於指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
<bean id="accountService2" class="com.msg.impl.AccountServiceImpl2">
<property name="name" value="TEST" ></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean>
<!-- 配置一個日期對象以供birthday屬性引用 -->
<bean id="now" class="java.util.Date"></bean>
- 在property標籤中注入array(數組) Map List Set屬性時都有相應的標籤與之對應使用方法如下:
(結構相同,標籤可以互換就比如爲數組注入可以使用list或set標籤注入)
<bean id="accountService3" class="com.msg.impl.AccountServiceImpl3">
<!--數組注入-->
<property name="myarray">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<!--list注入-->
<property name="myList">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<!--set注入-->
<property name="mySet">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<!--set注入-->
<property name="myMap">
<map>
<entry key="testC">ccc</prop>
<entry key="testD">ddd</prop>
</map>
</property>
</bean>
- 優勢:
創建對象時沒有明確的限制,可以直接使用默認構造函數 - 弊端:
如果有某個成員必須有值,則獲取對象是有可能set方法沒有執行。
第三種:註解注入
延申純註解開發
首先介紹一下bean的常用屬性配置:
<bean id="" class="" scope="" init-method="" destroy-method=""></bean>
- id:id的值是我們通過ApplicationContext容器獲取對象時的依據(唯一的)
- class:值爲 類的全限定地址
- init-method:值爲類初始化所執行的方法名
- destroy-method:值爲類的銷燬時所執行的方法
- scope:用於指定bean的作用範圍取值: 常用的就是單例的和多例的 singleton:單例的(默認值) prototype:多例的 request:作用於web應用的請求範圍 session:作用於web應用的會話範圍 global-session:作用於集羣環境的會話範圍(全局會話範圍),當不是集羣環境時,它就是session
-
下面我們來介紹註解:
- 註解的作用: 和在XML配置文件中編寫一個標籤實現的功能是一樣的只不過配置的方式不同
-
用於把當前類對象存入spring容器中註解
-
@Component:
- 作用:將當前標註的類對象存入Spring容器中- 屬性: value:用於指定bean的id。當我們不寫時,它的默認值是當前類名,且首字母改小寫 。
- @Component衍生的註解:(以下三個註解他們的作用和屬性與Component是一模一樣,他們三個是spring框架爲我們提供明確的三層使用的註解,使我們的三層對象更加清晰)
- @Controller:一般用在表現層
- @Service:一般用在業務層
- @Repository:一般用在持久層
-
-
用於注入數據的註解
-
作用:他們的作用就和在xml配置文件中的bean標籤中寫一個標籤的作用是一樣的
-
@Autowired註解:
- 作用:自動按照類型注入。只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功, 如果ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。
如果Ioc容器中有多個類型匹配時則需要**@Qualifier**註解配合使用 - 出現位置:
可以是變量上,也可以是方法上 - 細節:
在使用註解注入時,set方法就不是必須的了。
- 作用:自動按照類型注入。只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功, 如果ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。
-
@Qualifier註解:
- 作用:在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用要與@Autowired註解的配合下使用。但是在給方法參數注入時可以
- 屬性:value:用於指定注入bean的id。
-
@Resource註解(推薦使用)
- 作用:直接按照bean的id注入。它可以獨立使用
- 屬性:
name:用於指定bean的id。
-
@Value註解
- 作用:用於注入基本類型和String類型的數據
- 屬性:
value:用於指定數據的值。它可以使用spring中SpEL(也就是spring的el表達式)
SpEL的寫法:${表達式}
-
另外,集合類型的注入只能通過XML來實現。