6.依賴注入(Dependency Injection)

6.依賴注入(Dependency Injection)

依賴:bean對象的建立依賴容器java

注入:bean對象全部屬性,由容器注入spring

6.1 構造函數注入

  • 參考第四點建立對象的方式數組

  • 構造函數注入分爲app

    • 無參構造注入函數

    • 有參構造注入測試

 

6.2 基於Setter的依賴注入(重點)

其實咱們在一開始瞭解IOC思想的時候就是用Setter注入的可是那是最基本的下面開始分析複雜的spa

基於spring的setter注入官方解釋code

  • Spring團隊一般提倡使用構造函數注入,由於它可讓您將應用程序組件實現爲不可變對象,並確保不存在必需的依賴項null。此外,注入構造函數的組件始終以徹底初始化的狀態返回給客戶端(調用)代碼。附帶說明一下,大量的構造函數自變量是一種很差的代碼味,這代表該類可能承擔了太多的職責,應進行重構以更好地解決關注點分離問題。xml

  • Setter注入主要應僅用於能夠在類中分配合理的默認值的可選依賴項。不然,必須在代碼使用依賴項的任何地方執行非空檢查。對象

  • setter注入的一個好處是,setter方法可以使該類的對象在之後從新配置或從新注入。

第一步:編寫實體類(最好的各個注入類型都包含)(省略getset和toString)

 public class Student implements Serializable {
     private String name;
     private Integer age;
     private Teacher teacher;
     private String[] books;
     private List<String> hobbies;
     private Map<String,Object> score;
     private Set<String> games;
     private Properties subject;
 }
 public class Teacher implements Serializable {
 
     private String name;
     private Integer age;
 }

第二步:編寫核心配置文件applicationContext.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd">
 
     <bean id="teacher" class="com.xuan.pojo.Teacher">
         <constructor-arg type="java.lang.String" value="jiaoshi"/>
         <constructor-arg type="java.lang.Integer" value="50"/>
     </bean>
     <bean id="student" class="com.xuan.pojo.Student">
         <!--學生年齡-->
         <property name="age" value="22"/>
         <!--學生的姓名-->
         <property name="name" value="xieying"/>
         <!--引用老師類-->
         <property name="teacher" ref="teacher"/>
         <!--數組(書)-->
         <property name="books">
             <array>
                 <value>簡愛</value>
                 <value>追風箏的人</value>
             </array>
         </property>
         <!--list集合愛好-->
         <property name="hobbies">
             <list>
                 <value>打籃球</value>
                 <value>踢足球</value>
                 <value>打羽毛球</value>
             </list>
         </property>
         <!--set集合(遊戲)-->
         <property name="games">
             <set>
                 <value>王者榮耀</value>
                 <value>吃雞</value>
                 <value>英雄聯盟</value>
             </set>
         </property>
         <!--map集合(分數)-->
         <property name="score">
             <map>
                 <entry key="語文" value="111"/>
                 <entry key="數學" value="96"/>
                 <entry key="英語" value="120"/>
             </map>
         </property>
         <!--Properties集合(科目)-->
         <property name="subject">
             <props>
                 <prop key="chinese">yang</prop>
                 <prop key="English">huang</prop>
                 <prop key="sports">liu</prop>
             </props>
         </property>
 
     </bean>
 
 </beans>

 

第三步:編寫測試

 public class TestUser {
 
     public static void main(String[] args) {
         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
 
         Student student = applicationContext.getBean("student", Student.class);
 
         System.out.println(student);
    }
     
 }

 

測試結果:

 Student{name='xieying', age=22, teacher=Student{name='jiaoshi', age=50}, 
    books=[簡愛, 追風箏的人], hobbies=[打籃球, 踢足球, 打羽毛球],
          score={語文=111, 數學=96, 英語=120}, games=[王者榮耀, 吃雞, 英雄聯盟],
          subject={English=huang, chinese=yang, sports=liu}}

 

 

 

 

6.3 拓展方式注入

 

 

6.3.1 p-命名空間的XML快捷方式(與set注入配合)

p-namespace容許您使用bean元素的屬性(而不是嵌套 <property/>元素)來描述協做bean的屬性值,或同時使用這二者。

  • Spring支持帶有 XML定義的命名空間的可擴展配置格式。

  •  xmlns:p="http://www.springframework.org/schema/p"
  • 關鍵是引入相應的 p-命名空間

  • 用法就是 P:屬性="屬性值"

 beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
 
     <bean name="user" class="com.xuan.pojo.User" p:name="John" p:age="20"/>
   
 </beans>

 

 

6.3.2 c-namespace的XML快捷方式(與構造器配合)

與p-namespace相識,c-namespace容許使用內聯屬性來配置構造函數參數,而不是嵌套constructor-arg元素。

  •  xmlns:c="http://www.springframework.org/schema/c"
  • 引入c命名空間

  • 用法: c:構造器參數="屬性值"

 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:c="http://www.springframework.org/schema/c"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd">
 
     <bean id="beanTwo" class="x.y.ThingTwo"/>
     <bean id="beanThree" class="x.y.ThingThree"/>
 
     <!-- traditional declaration with optional argument names -->
     <bean id="beanOne" class="x.y.ThingOne">
         <constructor-arg name="thingTwo" ref="beanTwo"/>
         <constructor-arg name="thingThree" ref="beanThree"/>
         <constructor-arg name="email" value="something@somewhere.com"/>
     </bean>
 
     <!-- c-namespace declaration with argument names -->
     <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
         c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>
 
 </beans>
相關文章
相關標籤/搜索