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不好維護,同時功能也不如註解強大。