spring學習(三)DI 依賴注入
使用IOC容器來解決物件之間的依賴關係:物件之間的依賴關係,其實就是給物件上的屬性賦值!因為物件上有其他物件的變數,因此存在了依賴
Spring提供了好幾種的方式來給屬性賦值
-
1) 通過建構函式
-
2) 通過set方法給屬性注入值
-
3) p名稱空間
-
4)自動裝配(瞭解)
-
5) 註解(重要)
在xml中使用建構函式賦值
<bean id="userDao" class="bean.UserDao"/>
<bean id="userService" class="bean.UserService">
<constructor-arg name="userDao" type="bean.UserDao" ref="userDao"/>
</bean>
在xml中通過set方法賦值
applicationContext.xml配置檔案:通過property節點來給屬性賦值
-
引用型別使用ref屬性
-
基本型別使用value屬性
<bean id="userDao" class="bean.UserDao"/>
<bean id="userService" class="bean.UserService">
<property name="userDao" ref="userDao"/>
</bean>
內部bean賦值
先建立userService,發現userService需要userDao的屬性,再建立userDao
applicationContext.xml配置檔案:property節點內建bean節點(不能複用)
<bean id="userService" class="bean.UserService">
<property name="userDao">
<bean id="userDao" class="bean.UserDao"/>
</property>
</bean>
p名稱空間注入屬性值
p名稱控制元件這種方式其實就是set方法的一種優化,優化了配置而已
在<beans>元素中加入宣告xmlns:p="http://www.springframework.org/schema/p"
applicationContext.xml配置檔案:使用p名稱空間
<bean id="userService" class="bean.UserService" p:userDao-ref="userDao"/>
自動裝配
Spring還提供了自動裝配的功能,能夠非常簡化我們的配置
自動裝載預設是不開啟的,自動裝配常用的可分為兩種:
-
根據名字裝配
-
根據型別裝配
XML配置根據名字裝配
applicationContext.xml配置檔案:使用自動裝配,根據名字
<bean id="userDao" class="bean.UserDao"/>
<!--
1.通過名字來自動裝配
2.發現userService中有個叫userDao的屬性
3.看看IOC容器中沒有叫userDao的物件
4.如果有,就裝配進去
-->
<bean id="userService" class="bean.UserService" autowire="byName"/>
XML配置根據型別裝配
applicationContext.xml配置檔案:使用自動裝配,根據型別
值得注意的是:如果使用了根據型別來自動裝配,那麼在IOC容器中只能有一個這樣的型別,否則就會報錯!
<bean id="userDao" class="UserDao"/>
<!--
1.通過型別來自動裝配
2.發現userService中有個UserDao型別的屬性
3.看看IOC容器中UserDao型別的物件
4.如果有,就裝配進去
-->
<bean id="userService" class="UserService" autowire="byType"/>
設定全域性自動裝配
在<beans>宣告的最後新增 default-autowire="byName"
使用註解自動裝配
@Autowired註解來實現自動裝配:
-
可以在 成員變數(不用寫setter方法)、構造器、setter方法 上修飾
-
如果沒有匹配到bean(或允許為null),又為了避免異常的出現,我們可以設定required屬性為false
@Autowired(required=false)
-
J2EE的@Resource和@AutoWired有相同的功能,區別如下:
-
@Resource預設按byName裝配,可以設定屬性來選擇使用name 或者 type 裝配
-
@AutoWired預設按byType裝配,如果想使用name裝配,結合@Qualifier註解使用
-