4.Spring DI - 依賴注入


?? 概述

?? 什么是依賴?
A. 依賴值得就是Bean實例中的屬性
B. 屬性分為:\color{red}{簡單}類型(8種基本類型和String類型)的屬性、\color{red}{POJO}類型的屬性、\color{red}{集合數組}類型的屬性

?? 什么是依賴注入?
依賴注入:\color{red}{Dependency} \color{red}{Injection} 它是spring 框架核心 \color{red}{ IOC}的具體實現

?? 為什么要進行依賴注入?
A. 我們的程序在編寫時,通過控制反轉,把對象的創(chuàng)建交給了spring,但是代碼中不可能出現沒有依賴的情況。
B. ioc解耦只是降低他們的依賴關系,但不會消除。例如:我們的業(yè)務層仍會調用持久層的方法。那這種業(yè)務層和持久層的依賴關系,在使用spring之后,就讓spring來維護了。
C. 簡單的說,就是坐等框架把持久層對象傳入業(yè)務層,而不用我們自己去獲取。


?? 依賴注入的方式(基于XML)

?? 構造函數注入
顧名思義,就是使用類中的構造函數,給成員變量賦值
注意,賦值的操作不是我們自己做的,而是通過配置的方式,讓spring框架來為我們注入。

具體的代碼如下:

public class UserServiceImpl implements UserService {
  private int id;
  private String name;
  
  public UserServiceImpl(int id, String name) {
      this.id = id;
      this.name = name;
  }
  @Override
  public void saveUser() {
      System.out.println("保存用戶:id為"+id+",name為"+name+"   Service實現");
  }
}

??使用構造函數的方式,給 service 中的屬性傳值要求:類中需要提供一個對應參數列表的構造函數。
涉及的標簽:\color{blue}{constructor-arg}
\color{red}{index}:指定參數在構造函數參數列表的索引位置
\color{red}{name}:指定參數在構造函數中的名稱
\color{red}{value}:它能賦的值是基本數據類型和string類型
\color{red}{ref}:它能賦的值是其他類型,也就是說,必須得是在配置文件中配置過的bean

<bean id="studentService" class="com.o98k.spring.service.StudentServiceImpl">
      <constructor-arg name="id" value="1"></constructor-arg>
      <constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>

?? set方法注入(重點)
set方法注入又分為\color{blue}{手動裝配}方式注入和\color{blue}{自動裝配}方式注入。
??手動裝配方式(XML方式):bean標簽的子標簽property,需要在類中指定set方法。
??自動裝配方式(注解方式,后面講解):@Autowired注解、@Resource注解。

  • @Autowired:一部分功能是查找實例,從spring容器中根據類型(java類)獲取對應的實例。另一部分功能就是賦值,將找到的實例,裝配給另一個實例的屬性值。(\color{red}{注意事項}:一個java類型在同一個spring容器中,只能有一個實例)
  • @Resource:一部分功能是查找實例,從spring容器中根據Bean的名稱(bean標簽的名稱)獲取對應的實例。另一部分功能就是賦值,將找到的實例,裝配給另一個實例的屬性值。

?? 使用p名稱空間注入數據(本質上還是調用set方法)

  1. 步驟一:需要先引入 p 名稱空間
    在schema的名稱空間中加入該行:xmlns:p="http://www.springframework.org/schema/p"

  2. 步驟二:使用p名稱空間的語法
    p:屬性名 = "(基本類型)"
    p:屬性名-ref = "(對象引用)"

  3. 步驟三:測試

<bean id="person" class="com.o98k.spring.demo.Person" p:pname="老王" p:car2-ref="car2"/>
<bean id="car2" class="com.o98k.spring.demo.Car2" />

?? 依賴注入不同類型的屬性(基于XML)

?? 簡單類型(value)

<bean id="studentService" class="com.o98k.spring.service.StudentServiceImpl">
      <property name="id" value="1"></property>
      <property name="name" value="zhangsan"></property>
</bean>

?? 引用類型(ref)
\color{red}{ref就是reference的縮寫,是引用的意思}

<bean id="studentService" class="com.o98k.spring.service.StudentServiceImpl">
      <property name="studentDao" ref="studentDao"></constructor-arg>
</bean>
<bean id="studentDao" class="com.o98k.spring.dao.StudentDaoImpl"></bean>

?? 集合類型(數組)
??1. 如果是數組或者List集合,注入配置文件的方式是一樣的

   <bean id="collectionBean" class="com.o98k.demo5.CollectionBean">
       <property name="arrs">
           <list>
              //如果集合內是簡單類型,使用value子標簽,如果是POJO類型,則使用bean標簽
               <value>美美</value>
               <value>小風</value>
              <bean></bean>
           </list>
       </property>
   </bean>

??2. 如果是Set集合,注入的配置文件方式如下:

   <property name="sets">
       <set>
          //如果集合內是簡單類型,使用value子標簽,如果是POJO類型,則使用bean標簽
           <value>哈哈</value>
           <value>呵呵</value>
       </set>
   </property>

??3. 如果是Map集合,注入的配置方式如下:

  <property name="map">
       <map>
           <entry key="老王2" value="38"/>
           <entry key="鳳姐" value="38"/>
           <entry key="如花" value="29"/>
       </map>
   </property>

??4. 如果是Properties集合的方式,注入的配置如下:

   <property name="pro">
       <props>
           <prop key="uname">root</prop>
           <prop key="pass">123</prop>
       </props>
   </property>


? 本文章非原創(chuàng)
? 僅供參考學習
? 內容來源于某視頻網教學課件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容