1. 程式人生 > >Spring IOC使用Setter依賴注入

Spring IOC使用Setter依賴注入

如果Spring使用XML配置形式,最常用有兩種依賴注入方式:setter注入和構造器注入。

這裡主要討論基於setter方法的依賴注入。

一 Setter注入Bean

1、建立一個HelloService介面

package com.lanhuigu.spring.common;

public interface HelloService {
    void sayHello(String name);
}

2、HelloServiceImpl實現類

package com.lanhuigu.spring.common;

public class HelloServiceImpl implements HelloService{

    @Override
    public void sayHello(String name) {
        System.out.println("hello:" + name);
    }
}

3、建立一個SelfIntroductionService(自我介紹)介面

package com.lanhuigu.spring.constructor;

public interface SelfIntroductionService {
    void selfIntroduction();
}

4、SelfIntroductionServiceImpl實現類

package com.lanhuigu.spring.setter;

import com.lanhuigu.spring.common.HelloService;

public class SelfIntroductionServiceImpl implements SelfIntroductionService {
    private HelloService helloService;

    // setter方式注入Bean
    public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
    }

    @Override
    public void selfIntroduction() {
        // 向大家打招呼
        helloService.sayHello("大家好!");
    }

}

5、Spring XML配置applicationContext-Setter.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宣告:
         該bean類似於javaConfig中的@Bean註解;
         用於建立bean的類通過class屬性來指定,並且需要使用全限定的類名。
         通過id指定bean的ID。如果不顯示指定,預設使用class的全限定名進行命名。
         eg:
         com.lanhuigu.spring.common.HelloServiceImpl#0,其#0是一個計數器的形式,
         用來區分相同型別的其他bean。
         使用自動化命名很方便,但是沒有多少實際用處,還是建議自己給bean顯示設定ID。
     -->
    <bean id="helloService" class="com.lanhuigu.spring.common.HelloServiceImpl"/>

    <!-- setter注入bean -->
    <bean id="selfIntroductionService" class="com.lanhuigu.spring.setter.SelfIntroductionServiceImpl">
        <property name="helloService" ref="helloService"/>
    </bean>

</beans>

6. 測試setter注入Bean

package com.lanhuigu.spring;

import com.lanhuigu.spring.setter.SelfIntroductionService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 測試setter注入Bean
 */
public class TestHelloSetter {

    @Test
    public void testHello() {
        // 根據spring配置檔案建立應用上下文
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext-Setter.xml");
        // 從容器中獲取bean
        SelfIntroductionService selfIntroductionService
                = (SelfIntroductionService)context.getBean("selfIntroductionService");
        // 呼叫自我介紹
        selfIntroductionService.selfIntroduction();
    }

}

7. 執行結果

hello:大家好!
 

總結:

自我介紹類中SelfIntroductionServiceImpl,通過set方法注入bean,

在XML中通過<property name="helloService" ref="helloService"/>指明依賴關係。

二 Setter方法注入字面量

setter方法除了上面應用於注入bean之外,還可以用於注入字面量。

1、建立一個類

package com.lanhuigu.spring.entity;

/**
 * 個人資訊
 */
public class Person {

    /** 姓名 */
    private String name;
    /** 性別 */
    private String sex;
    /** 年齡 */
    private int age;
    /** 興趣愛好 */
    private String hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

2、spring配置applicationContext-Setter.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">
   
    <!-- setter注入字面量 -->
    <bean id="person" class="com.lanhuigu.spring.entity.Person">
        <property name="name" value="tom"/>
        <property name="sex" value="男"/>
        <property name="age" value="26"/>
        <property name="hobby" value="愛好女人,哈哈!開個玩笑!"/>
    </bean>
    
</beans>

3、測試setter注入字面量

package com.lanhuigu.spring;

import com.lanhuigu.spring.entity.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 測試setter注入字面量
 */
public class TestPersonSetter {

    @Test
    public void testPerson() {
        // 根據spring配置檔案建立應用上下文
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext-Setter.xml");
        // 從容器中獲取bean
        Person person = (Person) context.getBean("person");
        // 列印個人屬性
        System.out.println(" 姓名: " + person.getName() +
                           " 性別: " + person.getSex() +
                           " 年齡: " + person.getAge() +
                           " 興趣愛好: " + person.getHobby());
    }

}

4、執行結果

姓名: tom 性別: 男 年齡: 26 興趣愛好: 愛好女人,哈哈!開個玩笑!

三 Setter方法注入集合

setter方法還可以用來注入集合,直接看看例項。

1、建立集合類

package com.lanhuigu.spring.collection;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *  spring 注入集合
 */
public class Collection {
    private Set<String> set;
    private List<String> list;
    private Map<String, String> map;
    private String[] array;

    public Set<String> getSet() {
        return set;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public String[] getArray() {
        return array;
    }

    public void setArray(String[] array) {
        this.array = array;
    }

    @Override
    public String toString() {
        return "Collection{" +
                "  set=" + set +
                ", list=" + list +
                ", map=" + map +
                ", array=" + Arrays.toString(array) +
                '}';
    }
}

2、Spring xml配置applicationContext-Setter.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">
    
    <!-- setter注入集合 -->
    <bean id="collection" class="com.lanhuigu.spring.collection.Collection">
        <!-- Set集合的屬性注入 -->
        <property name="set">
            <set>
                <value>set1</value>
                <value>set2</value>
                <value>set3</value>
            </set>
        </property>
        <!-- List集合的屬性注入 -->
        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
                <value>list3</value>
            </list>
        </property>
        <!-- 陣列的注入 -->
        <property name="array">
            <list>
                <value>array1</value>
                <value>array1</value>
                <value>array1</value>
            </list>
        </property>
        <!-- Map集合的屬性注入 -->
        <property name="map">
            <map>
                <entry key="key1" value="map1"></entry>
                <entry key="key2" value="map2"></entry>
                <entry key="key3" value="map3"></entry>
            </map>
        </property>
    </bean>

</beans>

3、測試Setter注入集合

package com.lanhuigu.spring;

import com.lanhuigu.spring.collection.Collection;
import com.lanhuigu.spring.entity.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 測試setter注入集合
 */
public class TestCollectionSetter {

    @Test
    public void testPerson() {
        // 根據spring配置檔案建立應用上下文
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext-Setter.xml");
        // 從容器中獲取bean
         Collection collection=(Collection) context.getBean("collection");
        // 列印個人屬性
        System.out.println("Setter注入集合:" + collection.toString());
    }

}

4、執行結果

Setter注入集合:Collection{  set=[set1, set2, set3], list=[list1, list2, list3], map={key1=map1, key2=map2, key3=map3}, array=[array1, array1, array1]}

四 總結

Spring setter注入可用於注入bean、字面量、集合;

如果是新專案,建議使用Spring註解,因為一堆一堆的xml不好維護,同時功能也不如註解強大。