1、應用場景:Spring會幫建立實現類的實例,可是有時候咱們還須要在類中設置一些屬性用於傳入設置值,這些跟類緊密關聯的屬性就叫依賴,經過spring幫忙設置的過程叫依賴注入。java
2、依賴注入的實現spring
A.構造方法的注入。數組
//這樣配置bean都是經過無參構造生成bean實例 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"/>
經過上面無參構造咱們想到是否有有參構造建立實例了,這樣不就達到了注入屬性的目的了嗎?確實,看下面:app
//java代碼: private String name; public UserDaoImpl(String name) { this.name = name; } @Override public void insert() { System.out.println(name+"用戶信息插入"); } //配置文件 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"> <constructor-arg name="name" value="李四"/> </bean>
只提供了有參構造而沒有提供無參,因此如今Spring只能經過有參構造來建立實例,並注入屬性。ide
B.set方式注入。this
這種方式就比較常見了,在須要實例化的類裏面提供屬性及其set方法。spa
//java類裏面: private String name; @Override public void insert() { System.out.println(name+"用戶信息插入"); } public void setName(String name) { this.name = name; }
配置文件裏:3d
<bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"> <!-- 屬性依賴注入,底層會自動封裝,只要在dao實現類提供屬性和set方法就行 --> <property name="name" value="張三"></property> </bean>
運行結果:代理
18:05:18,439 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:05:18 CST 2019]; root of context hierarchy 18:05:18,461 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml] 張三用戶信息插入
C.構造或者set設置非普通屬性(對象或者數組等引用類型)code
//在須要Spring代理的實體類中用set或者構造 private Car car; /*public UserDaoImpl(Car car) { this.car = car; }*/ public void setCar(Car car) { this.car = car; } @Override public void insert() { System.out.println(car); }
主要看配置文件:
<bean id="car" class="cn.xxx.bean.Car"> <property name="carName" value="奇瑞QQ"></property> <property name="money" value="50000"></property> </bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"> <!-- <constructor-arg name="car" ref="car"></constructor-arg> --> <!-- 非普通屬性注入,注意,ref爲引用其餘代理類的id或者name,這裏面name裏面car表明上面引用id的實例,必須保持一致,不然出錯 --> <property name="car" ref="car"></property> </bean>
也就是說只靠在實體類裏設置property不夠,咱們須要對象裏面每一個屬性的值,因此直接把bean類託管給Spring。在咱們須要的類裏面用ref屬性引入這個bean類
運行結果:
18:43:10,444 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:43:10 CST 2019]; root of context hierarchy
18:43:10,476 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奇瑞QQ, money=50000.0]
D.P名稱空間的屬性注入(Spring2.5版本之後)
有點相似與表達式那種,能夠替換一些標籤,用處不大,瞭解一下。首先得引入p名稱空間(名稱空間是xml中的概念)
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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 id="car" class="cn.xxx.bean.Car" p:carName="勞斯萊斯" p:money="12000000"> </bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" p:car-ref="car" p:name="王校長"> </bean>
就是將一些在property等標籤裏面寫的東西拿到了bean標籤上面寫,簡化了代碼量
E:SPEL的方式屬性注入(Spring3.x版本後使用)
SpEL:Spring Expression Language(Spring表達式語言),語法:#{SpEL}
<bean id="car" class="cn.xxx.bean.Car" > <property name="carName" value="#{'奔馳'}" ></property> <property name="money" value="#{600000}"></property> </bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" > <!-- 注意無論數據類型複雜與否,都用value --> <property name="car" value="#{car}"></property> <!-- 引入另外一個類裏面的屬性 --> <!-- <property name="carName" value="#{car.carName}"></property> -->
運行:
20:43:14,694 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 20:43:14 CST 2019]; root of context hierarchy
20:43:14,709 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奔馳, money=600000.0]
小周用戶信息插入
F:複雜數據類型注入(集合,數組)
配置文件:
<bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" > <property name="arrs"> <array> <value>你</value> <value>我</value> <value>它</value> </array> </property> <!-- 定義list集合 --> <property name="list"> <list> <value>芙蓉</value> <value>如花</value> <value>鳳姐</value> </list> </property> <!-- 定義map集合 ,key裏面有個key-ref,因此能夠傳引入類型--> <property name="map"> <map> <entry key="aaa" value="111"></entry> <entry key="bbb" value="222"></entry> <entry key="ccc" value="333"></entry> </map> </property> </bean>
//bean裏面 private String[] arrs; private List<String> list; private Map<String,String> map;public void setArrs(String[] arrs) { this.arrs = arrs; } public void setList(List<String> list) { this.list = list; } public void setMap(Map<String, String> map) { this.map = map; }
運行結果:
21:27:48,113 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 21:27:48 CST 2019]; root of context hierarchy 21:27:48,128 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml] 你 我 它 芙蓉 如花 鳳姐 aaa...111 bbb...222 ccc...333
若是是set集合那麼就用set標籤。上面就是屬性注入全方位講解了。