Spring有多種依賴注入的形式,本篇文章僅介紹Spring通過xml進行IOC配置的方式。
平常的Java開發中,程序員在某個類中需要依賴其它類的方法。
通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理。
Spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過Spring容器幫我們new指定實例並且將實例注入到需要該對象的類中。
依賴注入的另一種說法是"控制反轉"。通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員。
而控制反轉是指new實例工作不由我們程序員來做而是交給Spring容器來做。
構造器注入: 本文使用構造器注入和引用了一個bean
先寫出需要引用的bean的接口
package com.spring; public interface SpringAocInterface { void show(); }
實現接口
package com.spring; public class SpringAocInterfaceIm implements SpringAocInterface { private final static String Lings = "最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。"; @Override public void show() { System.out.println(Lings); } }
需要注入的類 (提供了一個String屬性和一個對象 都是通過構造方法注入)
package com.spring; /** * 使用構造方法 * @author Administrator * */ public class SpringIoc { private String Song; //構造方法注入 private SpringAocInterface springAocInterface; //構造方法引入對象注入 public SpringIoc(String song, SpringAocInterface springAocInterface) { super(); Song = song; this.springAocInterface = springAocInterface; } public void show() { System.out.println("構造方法傳入的Song為 :" +Song); System.out.print("構造方法引入的對象為:"); springAocInterface.show(); } }
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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 構造方法注入 --> <bean id="SpringIoc" class="com.spring.SpringIoc"> <constructor-arg name="song" value="5"></constructor-arg> <!-- 給SpringIoc中的song屬性注入--> <constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 給SpringIoc中的springAocInterface 注入bean --> </bean> <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
<beans>
寫一個測試類
package com.spring.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.SpringIoc; public class SpringIocTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); SpringIoc bean = (SpringIoc) context.getBean("SpringIoc"); bean.show(); } }
輸出結果
十月 15, 2017 10:19:50 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e3bd51: startup date [Sun Oct 15 22:19:50 CST 2017]; root of context hierarchy 十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [spring.xml] 十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e40e825: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy 構造方法傳入的Song為 :5 構造方法引入的對象為:最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。
2:set注入(里面包括set注入 屬性 list集合 map集合 引入bean)
package com.spring; import java.util.List; import java.util.Map; /** * Spring通過Set注入 * @author Administrator * */ public class SpringSetIoc { private String name; private int age; private SpringAocInterface like; private List<Object> list; private Map<String, Object> map ; public void show() { System.out.println("通過set方法注入的姓名為:" + name); System.out.println("通過set方法注入的年齡為:" + age); System.out.print("通過set方法注入對象" + name + "最喜歡的一句話為:"); like.show(); System.out.print("通過set方法注入" + name + "最喜歡吃的水果為:"); for (Object object : list) { System.out.print(object + ","); } System.out.println(); System.out.print("通過set方法注入map key為string : "); for (String m : map.keySet()) { System.out.print(map.get(m) + ","); } } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public SpringAocInterface getLike() { return like; } public void setLike(SpringAocInterface like) { this.like = like; } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } }
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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean> <!-- set注入 --> <bean id="SpringSetIoc" class="com.spring.SpringSetIoc"> <property name="name" value="張三"></property> <property name="age" value="18"></property> <!-- <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 這個是注入公共bean 如果需要注入內部bean 並不想被共享可以使用下面的注入方式 --> <property name="like"> <bean class="com.spring.SpringAocInterfaceIm"></bean> </property> <property name="list"> <!-- 這個是注入list集合 這個是注入的值 如果想注入bean的話 可以 寫成 <ref bean = "bean的名稱"></ref> --> <list> <value>香蕉</value> <value>橘子</value> <value>蘋果</value> </list> </property> <property name="map"><!-- map注入 --> <map> <entry key="男士" value="李四"></entry> <entry key="男士" value="王五"></entry> <entry key="女士" value="小花"></entry> </map> </property> </bean> <!-- spring還提供了P命名空間 減少了尖括號 使用p命名空間的時候 需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 這句代碼 不然會報錯 兩者方法取其一就好 我使用的上面的方式--> <!-- <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "張三" p:age = "18" p:like-ref="SpringAocInterfaceIm"/> --> </beans>
測試類
package com.spring.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.SpringSetIoc; public class SpringSetIocTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); SpringSetIoc bean = (SpringSetIoc) context.getBean("SpringSetIoc"); bean.show(); } }
輸出結果
十月 15, 2017 10:26:14 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7f1633fd: startup date [Sun Oct 15 22:26:14 CST 2017]; root of context hierarchy 十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [spring.xml] 十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@741c42a9: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy 通過set方法注入的姓名為:張三 通過set方法注入的年齡為:18 通過set方法注入對象張三最喜歡的一句話為:最近的煩惱是小小的離別帶來的寂寞,一瞬間的邂逅與分別,這一個一個的剎那,我想好好珍惜起來。 通過set方法注入張三最喜歡吃的水果為:香蕉,橘子,蘋果, 通過set方法注入map key為string : 王五,小花,
最后奉上完整版的xml配置文件 包含構造注入和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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 構造方法注入 --> <bean id="SpringIoc" class="com.spring.SpringIoc"> <constructor-arg name="song" value="5"></constructor-arg> <!-- 給SpringIoc中的song屬性注入--> <constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 給SpringIoc中的springAocInterface 注入bean --> </bean> <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean> <!-- set注入 --> <bean id="SpringSetIoc" class="com.spring.SpringSetIoc"> <property name="name" value="張三"></property> <property name="age" value="18"></property> <!-- <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 這個是注入公共bean 如果需要注入內部bean 並不想被共享可以使用下面的注入方式 --> <property name="like"> <bean class="com.spring.SpringAocInterfaceIm"></bean> </property> <property name="list"> <!-- 這個是注入list集合 這個是注入的值 如果想注入bean的話 可以 寫成 <ref bean = "bean的名稱"></ref> --> <list> <value>香蕉</value> <value>橘子</value> <value>蘋果</value> </list> </property> <property name="map"><!-- map注入 --> <map> <entry key="男士" value="李四"></entry> <entry key="男士" value="王五"></entry> <entry key="女士" value="小花"></entry> </map> </property> </bean> <!-- spring還提供了P命名空間 減少了尖括號 使用p命名空間的時候 需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 這句代碼 不然會報錯 --> <!-- <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "張三" p:age = "18" p:like-ref="SpringAocInterfaceIm"/> --> </beans>