1. 程式人生 > 實用技巧 >spring學習(三)DI 依賴注入

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"

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="..."
xsi:schemaLocation="..."
default-autowire="byName">

使用註解自動裝配

@Autowired註解來實現自動裝配:

  • 可以在 成員變數(不用寫setter方法)、構造器、setter方法 上修飾

  • 如果沒有匹配到bean(或允許為null),又為了避免異常的出現,我們可以設定required屬性為false @Autowired(required=false)

  • J2EE的@Resource和@AutoWired有相同的功能,區別如下:

    • @Resource預設按byName裝配,可以設定屬性來選擇使用name 或者 type 裝配

    • @AutoWired預設按byType裝配,如果想使用name裝配,結合@Qualifier註解使用

    @Autowired 
    @Qualifier ( "baseDao" )