1. 程式人生 > >Spring學習--DI依賴注入

Spring學習--DI依賴注入

**依賴與依賴注入:**
    傳統應用程式設計中所說的依賴一般指“類之間的關係”,那先讓我們複習一下類之間的關係:
         **泛化:**表示類與類之間的繼承關係、介面與介面之間的繼承關係;
         **實現:**表示類對介面的實現;
         **依賴:**當類與類之間有使用關係時就屬於依賴關係,不同於關聯關係,依賴不具有“擁有關係”,而是一種“相識關係”,只在某個特定地方(比如某個方法體內)才有關係。
         **關聯:**表示類與類或類與介面之間的依賴關係,表現為“擁有關係”;具體到程式碼可以用例項變數來表示;
         **聚合:**屬於是關聯的特殊情況,體現部分-整體關係,是一種弱擁有關係;整體和部分可以有不一樣的生命週期;是一種弱關聯;
**組合:**屬於是關聯的特殊情況,也體現了體現部分-整體關係,是一種強“擁有關係”;整體與部分有相同的生命週期,是一種強關聯; **Spring IoC容器的依賴有兩層含義:Bean依賴容器和容器注入Bean的依賴資源**: **Bean依賴容器:**也就是說Bean要依賴於容器,這裡的依賴是指容器負責建立Bean並管理Bean的生命週期,正是由於由容器來控制建立Bean並注入依賴,也就是控制權被反轉了,這也正是IoC名字的由來,此處的有依賴是指Bean和容器之間的依賴關係。 **容器注入Bean的依賴資源:**容器負責注入Bean的依賴資源,依賴資源可以是Bean、外部檔案、常量資料等,在Java中都反映為物件,並且由容器負責組裝Bean之間的依賴關係,此處的依賴是指Bean之間的依賴關係,可以認為是傳統類與類之間的“關聯”、“聚合”、“組合”關係。 *
*為什麼要應用依賴注入,應用依賴注入能給我們帶來哪些好處呢?** **動態替換Bean依賴物件,程式更靈活:**替換Bean依賴物件,無需修改原始檔:應用依賴注入後,由於可以採用配置檔案方式實現,從而能隨時動態的替換Bean的依賴物件,無需修改java原始檔; **更好實踐面向介面程式設計,程式碼更清晰:**在Bean中只需指定依賴物件的介面,介面定義依賴物件完成的功能,通過容器注入依賴實現; **更好實踐優先使用物件組合,而不是類繼承:**因為IoC容器採用注入依賴,也就是組合物件,從而更好的實踐物件組合。採用物件組合,Bean的功能可能由幾個依賴Bean的功能組合而成,其Bean本身可能只提供少許功能或根本無任何功能, 全部委託給依賴Bean,物件組合具有動態性,能更方便的替換掉依賴Bean,從而改變Bean功能;而如果採用類繼承,Bean沒有依賴Bean,而是採用繼承方式新增新功能,,而且功能是在編譯時就確定了,不具有動態性,而且採用類繼承導致Bean與子Bean之間高度耦合,難以複用。
**增加Bean可複用性:**依賴於物件組合,Bean更可複用且複用更簡單; **降低Bean之間耦合:**由於我們完全採用面向介面程式設計,在程式碼中沒有直接引用Bean依賴實現,全部引用介面,而且不會出現顯示的建立依賴物件程式碼,而且這些依賴是由容器來注入,很容易替換依賴實現類,從而降低Bean與依賴之間耦合; **程式碼結構更清晰:**要應用依賴注入,程式碼結構要按照規約方式進行書寫,從而更好的應用一些最佳實踐,因此程式碼結構更清晰。 **Spring IoC容器注入依賴資源主要有以下兩種基本實現方式:** **構造器注入:**就是容器例項化Bean時注入那些依賴,通過在在Bean定義中指定構造器引數進行注入依賴,包括例項工廠方法引數注入依賴,但靜態工廠方法引數不允許注入依賴; **setter注入:**通過setter方法進行注入依賴;

entity

package org.liang.entity;

import java.util.Arrays;
import java.util.Map;

/**
 * Created by rcc on 2018/1/20.
 */
public class StudentName {
    private String[] names;
    private Map<String,String> address;
    private User user;

    public StudentName(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public StudentName(Map<String, String> address) {
        this.address = address;
    }

    public StudentName(String[] names, Map<String, String> address) {
        this.names = names;
        this.address = address;
    }

    public StudentName(String[] names, Map<String, String> address, User user) {
        this.names = names;
        this.address = address;
        this.user = user;
    }

    public Map<String, String> getAddress() {
        return address;
    }

    public void setAddress(Map<String, String> address) {
        this.address = address;
    }

    public StudentName() {
    }

    public StudentName(String[] names) {
        this.names = names;
    }

    public String[] getNames() {
        return names;
    }

    public void setNames(String[] names) {
        this.names = names;
    }

    @Override
    public String toString() {
        return "StudentName{" +
                "names=" + Arrays.toString(names) +
                ", address=" + address +
                ", user=" + user +
                '}';
    }
}

spring-config.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 http://www.springframework.org/schema/beans/spring-beans.xsd">


   <!-- <bean id="user" class="org.liang.entity.User" />-->

    <bean id="userService" class="org.liang.service.UserServiceImpl" />

    <bean id="persion" class="org.liang.entity.Persion">
        <constructor-arg index="0" value="doudou"/>
        <constructor-arg name="nickName" value="zhuzhu"/>
        <constructor-arg type="java.lang.Integer" value="18"/>
    </bean>

    <!--靜態工廠注入-->
    <bean id="userFactory" class="org.liang.factory.BeanFactory" factory-method="newInstance">
        <constructor-arg index="0" value="施瓦辛格"/>
        <constructor-arg name="gender" value="男"/>
        <constructor-arg type="java.lang.Integer" value="50"/>
    </bean>

    <!--setter注入-->
    <bean id="user" class="org.liang.entity.User">
        <property name="name" value="張三"/>
        <property name="gender" value="男"/>
        <property name="age" value="18"/>
    </bean>

    <!--注入集合、陣列、字典(Map)-->
    <bean id="students" class="org.liang.entity.StudentName">
        <property name="names">
            <list value-type="java.lang.String">
                <value>張三</value>
                <value>李四</value>
                <value>王二</value>
            </list>
        </property>
        <property name="address">
            <map key-type="java.lang.String" value-type="java.lang.String">
                <entry>
                    <key><value>10010</value></key>
                    <value>張三</value>
                </entry>
                <entry>
                    <key><value>10020</value></key>
                    <value>李四</value>
                </entry>
                <entry>
                    <key><value>10030</value></key>
                    <value>王二</value>
                </entry>
            </map>
        </property>
        <property name="user" ref="user">
        </property>
    </bean>
</beans>

test

package org.liang.test;

import org.liang.entity.Persion;
import org.liang.entity.StudentName;
import org.liang.entity.User;
import org.liang.factory.BeanFactory;
import org.liang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by rcc on 2018/1/19.
 * 測試類
 */
public class TestUser {
    public static void main(String [] args){

        /*ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Persion persion = context.getBean("persion", Persion.class);
        System.out.print(persion);*/
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        StudentName students = (StudentName) context.getBean("students");
        System.out.println(students);

    }
}

以上的示例呢是一個錯誤的示例,在工作或者學習中需要避免產生這種迴圈注入的情況,一旦產生這樣的情況後果是很嚴重的,所以,在依賴注入的時候需要避免這樣的你中有我我中有你的情況。