依賴注入的概念:
依賴注入:Dependency Injection。它是 spring 框架核心 ioc 的具體實現。
我們的程序在編寫時,通過控制反轉,把對象的創建交給了 spring,但是代碼中不可能出現沒有依賴的情況。
ioc 解耦只是降低他們的依賴關係,但不會消除。例如:我們的業務層仍會調用持久層的方法。
那這種業務層和持久層的依賴關係,在使用 spring 之後,就讓 spring 來維護了。
簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取。
第一種:構造函數注入(一般很少使用)
使用類中的構造函數,給成員變量賦值。注意,賦值的操作不是我們自己做的,而是通過配置
的方式,讓 spring 框架來爲我們注入。具體代碼如下:
- 優點: 在獲取bean對象時,必須注入數據,否則對象無法創建成功
- 弊端: 改變了bean對象的實例化方式,使我們在創建對象時,即使是用不到這些數據也必須提供
<!--使用構造函數注入
使用的標籤是 constructor-arg
標籤出現的位置,bean標籤的內部
標籤中的屬性
type:用戶執行要注入的數據的數據類型,該數據類型也是構造函數中某個或某些參數的類型
name: 用於指定給構造函數中的指定名稱賦值
value: 用於提供基本類型和string類型的數據
ref:用於指定其他的bean類型數據:指的是在spring核心容器IOC中出現過的bean
-->
<bean id="accountService" class="com.gao.service.impl.AccountServieImpl">
<constructor-arg name="name" value="張三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
public class Client {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
IAccountService iAccountService = (IAccountService)applicationContext.getBean("accountService");
iAccountService.saveAccount();
}
}
第二種:set方法注入(最常用)
在類中提供需要注入成員的 set 方法。具體代碼如下:
- 優點:創建對象時沒有明確的限制,可以直接使用默認的構造函數
- 缺點:如果有個成員是必須有值,則獲取對象是有可能set方法沒有執行
<!--set方法注入 (最常用的方式)
涉及的標籤:property
出現的位置:bean內部
標籤屬性:
name:用於指定注入時調用set方法的名稱
value:用於提供基本類型和string類型的數據
ref:用於提供bean類型的數據
-->
<bean id="accountService2" class="com.gao.service.impl.AccountServieImpl1">
<property name="name" value="張三"></property>
<property name="age" value="19"></property>
<property name="birthday" ref="now"></property>
</bean>
public class AccountServieImpl1 implements IAccountService {
private String name;
private Integer age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println("name"+name+"age"+age+"birthday"+birthday);
}
}
public class Client {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
IAccountService iAccountService = (IAccountService)applicationContext.getBean("accountService2");
iAccountService.saveAccount();
}
}
第三種:注入集合屬性
就是給類中的集合成員傳值,它用的也是set方法注入的方式,只不過變量的數據類型都是集合。我們這裏介紹注入數組,List,Set,Map,Properties。具體代碼如下:
xxx.xml
<!--注入集合數據
在注入集合數據時,只要結構相同,標籤可以互換
list結構的
array list set
map結構的
map entry props prop
-->
<bean id="accountService3" class="com.gao.service.impl.AccountServieImpl2">
<property name="myStr">
<array>
<value>我是字符串數組1</value>
<value>我是字符串數組1</value>
</array>
</property>
<property name="myList">
<list>
<value>我是list集合</value>
<value>我是list集合</value>
<value>我是list集合</value>
</list>
</property>
<property name="mySet">
<set>
<value>我是set集合</value>
<value>我是set集合</value>
<value>我是set集合</value>
</set>
</property>
<property name="myMap">
<props>
<prop key="map1">我是map集合1</prop>
<prop key="map1">我是map集合1</prop>
<prop key="map1">我是map集合1</prop>
</props>
</property>
<property name="myProperties">
<map>
<entry key="properties1" value="我是properties"></entry>
<entry key="properties2" value="我是properties"></entry>
</map>
</property>
</bean>
service
public class AccountServieImpl2 implements IAccountService {
private String [] myStr;
private List<String> myList;
private Set mySet;
private Map<String,String> myMap;
private Properties myProperties;
public String[] getMyStr() {
return myStr;
}
public void setMyStr(String[] myStr) {
this.myStr = myStr;
}
public List<String> getMyList() {
return myList;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public Set getMySet() {
return mySet;
}
public void setMySet(Set mySet) {
this.mySet = mySet;
}
public Map<String, String> getMyMap() {
return myMap;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public Properties getMyProperties() {
return myProperties;
}
public void setMyProperties(Properties myProperties) {
this.myProperties = myProperties;
}
@Override
public void saveAccount() {
System.out.println(Arrays.toString(myStr));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProperties);
}
}
controller
public class Client {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
IAccountService iAccountService = (IAccountService)applicationContext.getBean("accountService3");
iAccountService.saveAccount();
}
}