天天看點

Spring——IoC容器的學習(依賴注入)基礎概念IOC(Inversion of Control)

學習IoC容器

  • 基礎概念
  • IOC(Inversion of Control)
    • IOC建立對象的方式
    • Spring的配置
    • DI(Dependency Injection)
      • 構造注入
      • Set注入【重點】
      • 擴充方式

基礎概念

耦合 :程式之間的依賴關系,包括類之間的依賴和方法之間的依賴。

解耦 :降低程式之間的依賴關系。 實際開發中,應該做到編譯時不依賴,運作時才依賴。

解耦的思路 :

  1. 使用反射來建立對象,避免使用new關鍵字;
  2. 通過讀取配置檔案來擷取要建立的對象的全類限定名。

IOC(Inversion of Control)

控制反轉(IoC, Inversion of Control),是一個概念,是一種思想。把建立對象的權利交給容器,通過容器來實作對象的裝配和管理。控制反轉就是對對象控制權的轉移,從程式代碼本身反轉到了外部容器。通過容器實作對象的建立,屬性指派,依賴的管理。作用是削減計算機的耦合,解除代碼中的依賴關系。不用new的方式去建立對象了。

IOC建立對象的方式

  1. 無參構造,預設就是無參構造的。
<bean id="user" class="com.zmqcode.User.User">
        <property name="name" value="zmq"/>
    </bean>
           
  1. 有參構造
<!--1、下标指派-->
    <bean id="user" class="com.zmqcode.User.User">
        <constructor-arg index="0" value="zmq"/>
    </bean>
           
<!--2、通過類型建立-->
    <bean id="user" class="com.zmqcode.User.User">
        <!--基本類型可以直接type="int",引用類型必須全限定類名-->
        <constructor-arg type="java.lang.String" value="zmq"/>
    </bean>
           

不建議使用這種方法,如果構造器中傳入兩個同類型參數,沒辦法差別。

<!--3、直接通過參數名設定-->
    <bean id="user" class="com.zmqcode.User.User">
        <constructor-arg name="name" value="zmq"/>
    </bean>
           

在配置檔案加載的時候,容器中管理的對象就已經被初始化了,即使沒有在測試類中用到。

Spring的配置

<alias name="user" alias="别名"/>
	
    <bean id="user" class="com.zmqcode.User.User" name="别名">
        <constructor-arg name="name" value="zmq"/>
    </bean>
           

第二種方法更常用,name=“别名 别名2,别名3”

可以用逗号,空格,分号等分隔,取多個别名。

<import resource="beans_service.xml"/>
    <import resource="beans.xml"/>
           

導入多個配置檔案

DI(Dependency Injection)

IoC 是一個概念,是一種思想,其實作方式多種多樣。目前比較流行的實作方式是依賴注入。容器能知道哪個類運作的時候需要另外一個類,就是一個對象的使用需要另一個對象。

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

注入:bean對象中的所有屬性,由容器來注入

構造注入

<bean id="user" class="com.zmqcode.User.User">
        <constructor-arg name="name" value="zmq"/>
    </bean>
           

Set注入【重點】

列舉了不同類型的注入方式

<bean id="address" class="com.zmqcode.set.Address">
        <property name="address" value="武漢"/>
    </bean>

    <bean id="student" class="com.zmqcode.set.Student">
        <!--普通值注入-->
        <property name="name" value="zmq"/>

        <!--bean對象注入-->
        <property name="address" ref="address"/>

        <!--數組注入-->
        <!--這種方式和上面的方式都可以使用-->
        <property name="books">
            <array>
                <value>西遊記</value>
                <value>水浒傳</value>
                <value>紅樓夢</value>
                <value>三國演義</value>
            </array>
        </property>

        <!--list注入-->
        <property name="hobbits">
            <list>
                <value>聽歌</value>
                <value>看電影</value>
            </list>
        </property>

        <!--map注入-->
        <property name="card">
            <map>
                <entry key="身份證" value="123"/>
                <entry key="銀行卡" value="456"/>
            </map>
        </property>

        <!--set注入-->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>Dota</value>
            </set>
        </property>

        <!--null注入-->
        <property name="wife">
            <null>

            </null>
        </property>
    </bean>
           

擴充方式

p命名空間和c命名空間

  1. 導入依賴
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
           
  1. 修改xml檔案,導入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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
           
  1. 注入
<!--p命名空間注入。可以直接注入屬性,property-->
    <bean id="user" class="com.zmqcode.User.UserT" p:name="zmq" p:age="2"/>

    <!--c命名空間注入。類似于構造器注入,需要是有參的,類似construct-args-->
    <bean id="user2" class="com.zmqcode.User.UserT" c:age="2" c:name="zmq"/>
           

關于注解注入的介紹在我的這一篇部落格中 注解

關于建立Spring項目需要的配置依賴在我的上一篇部落格中有提到。配置