Spring中的依賴注入,稱爲dependency Injection,Ioc的做用下降程序之間的耦合,依賴關係管理交給Spring來維護,在當前類中須要用到其餘類的對象,由spring爲咱們提供,咱們只須要在配置文件中說明,依賴關係的維護,咱們稱之爲依賴注入java
基本數據類型和String、其餘bean類型(在配置文件中或者註解配置過的bean)、複雜類型/集合類型spring
①使用構造函數 ②使用set方法提供 ③使用複雜類型注入/集合類型注入函數
①目錄結構,接口實現類中屬性和方法測試
public class AccountServiceImpl implements IAccountService { //若是是常常變化的數據,並不適用於註冊的方式 private String name; private Integer age; private Date brithday; AccountServiceImpl(String name,Integer age,Date brithday){ this.name=name; this.age=age; this.brithday=brithday; } public void saveAccount(){ System.out.println("service中的saveAccount方法執行了...."+name+age+brithday); } }
②修改配置文件ui
在配置文件中,用使用標籤constructor-arg, 標籤出現的位置bean標籤內部this
標籤中屬性 type:用於指定要注入的數據的數據類型,該數據也是構造函數中某個或者某些參數的類型,不能獨立實現注入,index:用於指定注入的數據給構造函數中指定索引位置的參數賦值,索引的位置從0開始,須要記索引,name:用於給指定後遭函數中指定名稱的參數賦值(經常使用的)
=======================以上三個用於給構造函數中參數賦值=========================spa
value:用於給基本類型和Strig提供數據,ref:就是引用指定其餘的bean數據,它指的就是在Spring Ioc核心容器出現過的bean對象以下3d
<bean id="accountService" class="com.ithema.jdbc.service.impl.AccountServiceImpl"> <constructor-arg name="name" value="name"></constructor-arg> <constructor-arg name="age" value="20"></constructor-arg> <constructor-arg name="brithday" ref="now"></constructor-arg> </bean> <!--配置一個日期對象--> <bean id="now" class="java.util.Date"></bean>
③測試實現類,運行代碼獲得如下結果,成功實現了依賴注入code
package com.ithema.jdbc.ui; import org.springframework.core.io.ClassPathResource; import javax.annotation.Resource; public class Client { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml"); IAccountService as= (IAccountService) ac.getBean("accountService"); System.out.println(as); as.saveAccount(); }
優點:在獲取bean對象時候注入數據是必須的操做,不然對象沒法建立成功 弊端:改變了bean對象的實例化方式,使咱們在建立對象時候用不到這些數據也必須提供xml
①在接口類中實現屬性的set的方法
package com.ithema.jdbc.service.impl; import com.ithema.jdbc.service.IAccountService; import java.util.Date; /** * 帳戶的業務層實現類 */ public class AccountServiceImpl2 implements IAccountService { //若是是常常變化的數據,並不適用於註冊的方式 private String name; private Integer age; private Date brithday; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setBrithday(Date brithday) { this.brithday = brithday; } public void saveAccount(){ System.out.println("service中的saveAccount方法執行了...."+"名字:"+name+"年紀:"+age+"生日:"+brithday); } }
②配置文件中修改代碼
<bean id="accountService2" class="com.ithema.jdbc.service.impl.AccountServiceImpl2"> <property name="name" value="Test"></property> <property name="age" value="21"></property> <property name="brithday" ref="now"></property> </bean>
③測試類的運行,獲得如下結果
package com.ithema.jdbc.ui; import org.springframework.core.io.ClassPathResource; import javax.annotation.Resource; public class Client { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml"); IAccountService as= (IAccountService) ac.getBean("accountService2"); System.out.println(as); as.saveAccount(); }
使用set方法實現注入
優點:建立對象沒有明確的限制,能夠直接使用默認的構造函數 劣勢:若是某個成員必須有值,則獲取對象時候,set沒法執行
①接口實現類set方法
package com.ithema.jdbc.service.impl; import com.ithema.jdbc.service.IAccountService; import java.lang.reflect.Array; import java.util.*; /** * 帳戶的業務層實現類 */ public class AccountServiceImpl3 implements IAccountService { //複雜類型注入/集合注入 private String[] myStrs; private List<String> myList; private Map<String,String>myMap; private Properties myPro; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMyPro(Properties myPro) { this.myPro = myPro; } public void saveAccount(){ System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(myMap); System.out.println(myPro); } }
②改變配置文件中的代碼
<bean id="accountService3" class="com.ithema.jdbc.service.impl.AccountServiceImpl3"> <property name="myStrs"> <array> <value>AAAA</value> <value>BBBB</value> <value>CCC</value> </array> </property> <property name="myList"> <list> <value>AAA</value> <value>BBB</value> <value>CCC</value> </list> </property> <property name="myMap"> <map> <entry key="test1" value="AA"></entry> <entry key="test2" value="BB"></entry> <entry key="test3" value="CC"></entry> </map> </property> <property name="myPro"> <props> <prop key="test2">A</prop> <prop key="test1">B</prop> <prop key="test">C</prop> </props> </property> </bean>
③測試類的執行,執行的結果以下
package com.ithema.jdbc.ui; import org.springframework.core.io.ClassPathResource; import javax.annotation.Resource; public class Client { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml"); IAccountService as= (IAccountService) ac.getBean("accountService3"); System.out.println(as); as.saveAccount(); }