Spring學習筆記--IoC與DI

 

 

名詞解釋

  IoC

    程序中的之間的關係,不用代碼控制,而徹底是由容器來控制。在運行階段,容器會根據配置信息直接把他們的關係注入到組件中spring

    強調程序依賴關係由Spring容器控制ide

  DI

    之前的開發場景中,咱們每每經過硬編碼的形式維護依賴關係。這種方式使得功能模塊間耦合度極高(緊耦合),不易維護學習

    使用依賴注入後,依賴關係及實例化由Spring容器幫咱們維護,並注入到須要使用的功能模塊中測試

    強調程序間依賴關係由Spring容器在程序運行時注入依賴關係Beanthis

  優勢

    程序間的依賴關係徹底由Spring容器管理(註解,XML配置)。使得系統模塊間依賴度和耦合度有效下降,易維護,可擴展,鬆耦合編碼

依賴注入方式

  構造器注入

    /**
           * Created by Administrator on 2017/1/16/016.
            *
構造器注入示例
            *
           */
spa

    public class BraveKnight implements Knight {xml

      private Quest quest;對象

     public BraveKnight(Quest quest) {接口

            this.quest = quest;

        }

       @Override

       public void embarkOnQuest() {

        quest.embark();

      }

  }

  構造器依賴注入配置文件

  <?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:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/aop

      http://www.springframework.org/schema/aop/spring-aop.xsd

              http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--

        XML配置建立SlayDragonQuest對象(Spring託管)

        constructor-arg:構造方法注入參數屬性

        value:屬性值(此配置中使用Spring表達式語言將System.out傳入到構造器)

    -->

    <bean id="quest" class="springinaction.chapter1.SlayDragonQuest">

        <constructor-arg value="#{T(System).out}"/>

    </bean>

    <!--

        XML配置建立BraveKnight對象(Spring託管)

        constructor-arg:構造方法注入參數屬性(SlayDragonQuest對象)

        ref:引用Bean注入對象(經過已聲明bean的id查找並注入)

    -->

    <bean id="knight" class="springinaction.chapter1.BraveKnight">

        <constructor-arg ref="quest"/>

    </bean>

</beans>

測試類

/**

 * Created by Administrator on 2017/1/16/016.

 * 構造器依賴注入測試類

 */

public class KnightMain {

    public static  void  main(String[] args) throws Exception

    {

        /**

         *加載配置文件獲取Spring上下文對象

         */

        ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IoCDemo.xml");

        /**

         *Spring上下文對象根據id建立Bean

         */

        BraveKnight knight=(BraveKnight)context.getBean("knight");

        /**

         *調用Bean對應方法

         */

        knight.embarkOnQuest();

 

    }

}

注意事項:

構造方法傳入參數爲依賴接口

配置文件中依賴接口<bean></bean>構造方法依賴注入參數(constructor-arg),引用(ref)值爲聲明Bean的標識(id)

  Set方法注入

/**

 * Created by Administrator on 2017/1/17/017.

 * Set方法注入示例

 */

public class BraveKnightTestSet implements Knight {

    private Quest quest;

 

    public Quest getQuest() {

        return quest;

    }

 

    public void setQuest(Quest quest) {

        this.quest = quest;

    }

 

    @Override

    public void embarkOnQuest() {

        quest.embark();

}

Set方法配置文件

<?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:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/aop

      http://www.springframework.org/schema/aop/spring-aop.xsd

              http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--

        XML配置建立SlayDragonQuest對象(Spring託管)

        constructor-arg:構造方法注入參數屬性

        value:屬性值(此配置中使用Spring表達式語言將System.out傳入到構造器)

    -->

    <bean id="quest" class="springinaction.chapter1.SlayDragonQuest">

        <constructor-arg value="#{T(System).out}"/>

    </bean>

    <!--

        XML配置建立BraveKnight對象(Spring託管)

        property:set方法注入參數屬性(SlayDragonQuest對象),name的vakue與Bean對應PropertyName一致

        ref:引用Bean注入對象(經過已聲明bean的id查找並注入)

    -->

    <bean id="knightSet" class="springinaction.chapter1.BraveKnightTestSet">

        <property name="quest" ref="quest"/>

    </bean>

</beans>

測試類


/**
 * Created by Administrator on 2017/1/17/017.
 */
public class BraveKnightTestSetMain {

    public static void main(String[] args)
    {
        /**
         *
使用ClassPathXmlApplicationContext加載應用上下文
         */
       
ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocSetDemo.xml");
        BraveKnightTestSet knightTestSet=(BraveKnightTestSet)context.getBean("knightSet");
        knightTestSet.embarkOnQuest();
    }
}

注意事項

須要爲注入屬性提供setXXX()方法

配置文件中<bean></bean>添加<property name=」xxx」 ref(value)=」xxx」/>

其中name爲依賴屬性名稱

Ref爲引用Bean標識(id)

Value爲實際依賴值

  靜態工廠注入

/**

 * Created by Administrator on 2017/1/18/018.

 * 靜態工廠

 */

public class AnimalStaticFactor {

    /**

     *

     * @param type:動物類型

     * @return Animal

     */

    public static Animal getAnimal(String type)

    {

        if("cat".equalsIgnoreCase(type))

        {

            return new Cat();

        }

        else

        {

            return new Dog();

        }

    }

}
       靜態工廠依賴注入實例類

/**

 * Created by Administrator on 2017/1/18/018

 * 靜態工廠依賴注入實例.

 */

public class Cat implements Animal {

    private String message;

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    @Override

    public void sayHello() {

        System.out.println(message+",瞄~瞄");

    }

}

靜態工廠依賴注入實例類

/**

 * Created by Administrator on 2017/1/18/018.

 * 靜態工廠依賴注入示例

 */

public class Dog implements Animal {

    private String message;

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    @Override

    public void sayHello() {

        System.out.println(message+",汪~汪");

    }

}

靜態工廠依賴注入配置文件

<?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:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/aop

      http://www.springframework.org/schema/aop/spring-aop.xsd

              http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--配置AnimalFactor的getAnimal方法,使其建立Cat對象

            class:工廠類

            factor-method:靜態工廠方法

            constructor-arg value:靜態工廠參數

            property name:Cat實例須要注入的屬性

        -->

        <bean id="catFactor" class="springinaction.chapter1.AnimalStaticFactor" factory-method="getAnimal">

            <constructor-arg value="cat"/>

            <property name="message" value="貓貓"/>

        </bean>

        <!--

            配置AnimalFactor的getAnimal方法,使其建立Dog對象

            class:工廠類

            factor-method:靜態工廠方法

            constructor-arg value:靜態工廠參數

            property name:Dog實例須要注入的屬性

        -->

        <bean id="dogFactor" class="springinaction.chapter1.AnimalStaticFactor" factory-method="getAnimal">

            <constructor-arg value="dog"/>

            <property name="message" value="狗狗"/>

        </bean>

</beans>

靜態工廠測試類

/**

 * Created by Administrator on 2017/1/18/018.

 */

public class AnimalStaticFactorTest {

 

    public static void main(String[] args){

/**

 *使用ClassPathXmlApplicationContext加載應用上下文

 */

        ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocStaticFactorDemo.xml");

        /**

         *經過上下文對象建立標識爲catFactor的Bean並調用方法

         */

        Animal cat=context.getBean("catFactor",Animal.class);

        cat.sayHello();

        /**

         *經過上下文對象建立標識爲dogFactor的Bean並調用方法

         */

        Animal dog=context.getBean("dogFactor",Animal.class);

        dog.sayHello();

    }

}

 


注意事項

工廠類須要提供靜態方法生成實例Bean(實現特定接口),返回值爲接口類型

 

配置文件中class指向接口徹底名

 

Factor-method指定返回接口類型方法(實際返回的是根據參數創造的接口實現類)

 

依賴注入參數(constructor-arg)爲靜態工廠返回接口類型靜態方法依賴的參數

 

<property name=」xxx」 ref(value)=」xxx」/>

 

其中name爲依賴屬性名稱

 

Ref爲引用Bean標識(id)

 

Value爲實際依賴值

 

  實例工廠注入

/**

 * Created by Administrator on 2017/1/18/018.

 *實例工廠

 */

public class AnimalFactor {

    /**

     *

     * @param type:動物類型

     * @return 根據動物類型建立的動物實例對象

     */

    public Animal getAnimal(String type)

    {

        if("cat".equalsIgnoreCase(type))

        {

            return new Cat();

        }

        else

        {

            return new Dog();

        }

    }

}

實例工廠依賴注入實例類

/**

 * Created by Administrator on 2017/1/18/018

 * 實例工廠依賴注入實例.

 */

public class Cat implements Animal {

    private String message;

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    @Override

    public void sayHello() {

        System.out.println(message+",瞄~瞄");

    }

}

實例工廠依賴注入實例類

/**

 * Created by Administrator on 2017/1/18/018.

 * 實例工廠依賴注入示例

 */

public class Dog implements Animal {

    private String message;

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    @Override

    public void sayHello() {

        System.out.println(message+",汪~汪");

    }

}

實例工廠配置文件

<?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:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/aop

      http://www.springframework.org/schema/aop/spring-aop.xsd

              http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--聲明動物工廠類,id標識爲animalFactor-->

        <bean id="animalFactory" class="springinaction.chapter1.AnimalFactor"/>

        <!--聲明建立Cat的Bean,標識爲catFactor

            factor-bean:引用AnimalFactor

            factor-method:AnimalFactor類生成Animal實例Bean的方法

            property name:Cat類依賴注入屬性名稱

            property value:Cat類依賴注入屬性值

        -->

        <bean id="catFactor" factory-bean="animalFactory" factory-method="getAnimal">

            <constructor-arg value="cat"/>

            <property name="message" value="貓貓"/>

        </bean>

        <!--

            聲明建立Dog的Bean,標識爲dogFactor

            factor-bean:引用AnimalFactor

            factor-method:AnimalFactor類生成Animal實例Bean的方法

            property name:Dog類依賴注入屬性名稱

            property value>Dog類依賴注入屬性值

        -->

        <bean id="dogFactor" factory-bean="animalFactory" factory-method="getAnimal">

            <constructor-arg value="dog"/>

            <property name="message" value="狗狗"/>

        </bean>

</beans>

 

實例工廠測試類

/**

 * Created by Administrator on 2017/1/18/018.

 */

public class AnimalFactorTest {

    public static void main(String[] args){

        /**

        *使用ClassPathXmlApplicationContext加載應用上下文,建立上下文對象

        */

        ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocStaticFactorDemo.xml");

        /**

         *使用上下文對象根據標識catFactor創造並實例化Bean,並調用方法

         */

        Animal cat=context.getBean("catFactor",Animal.class);

        cat.sayHello();

        /**

         *使用上下文對象根據標識dogFactor創造並實例化Bean,並調用方法

         */

        Animal dog=context.getBean("dogFactor",Animal.class);

        dog.sayHello();

    }

}

注意事項

工廠類須要提供非靜態方法生成實例Bean(實現特定接口),返回值爲接口類型。

因須要使用實例工廠建立實例Bean,需在配置文件中聲明實例工廠Bean

依賴注入參數(constructor-arg)爲靜態工廠返回接口類型靜態方法依賴的參數

<property name=」xxx」 ref(value)=」xxx」/>

其中name爲依賴屬性名稱

Ref爲引用Bean標識(id)

Value爲實際依賴值

本章小結

本章主要對IoC,DI概念進行了介紹,使用簡單示例說明了依賴注入的使用方式方法

本章問題

經過Spring容器獲取實例Bean相關:

同一配置文件與不一樣配置文件的狀況下

  1. 標識(id)是否可重複?是否容許特殊字符?經過分隔符獲取實例個數(如何獲取)?如何設定可重複?可重複的處理策略?
  2. 名稱(name)是否可重複?是否容許特殊字符?經過分隔符獲取實例個數(如何獲取)?可重複的處理策略?
  3. 同時指定標識(id)和名稱(name)的狀況下的處理策略?
  4. 同時不指定標識(id)和名稱(name)的狀況下的處理策略?

預告

下一節將對Spring AOP和Aspects相關內容進行學習

相關文章
相關標籤/搜索