依賴注入(Dependency Injection)是用于實作控制反轉(Inversion of Control)的最常見的方式之一,本文詳細接收依賴注入各種資料類型和多種方法
準備
準備的兩個類:User、Student
User類有三個屬性,和兩個構造器
package cn.mym.entity;
public class User {
private Integer userId;
private String username;
private String password;
public User(Integer userId, String username, String password) {
this.userId = userId;
this.username = username;
this.password = password;
}
public User(){} //預設構造器再次顯示的聲明
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [userId=" + userId + ", username=" + username
+ ", password=" + password + "]";
}
Student中有自定義引用類型、複雜類型的準備
package cn.mym.entity;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Student {
private User user; //引用類型的注入
private String[] arr; //數組類型注入
private List<String> list; //List類型注入
private Set<String> set; //Set類型注入
private Map<String,Integer> map; //Map類型注入
private Properties pro; //Properties類型注入
/**示範構造器注入引用類型*/
public Student(User user){
this.user = user;
}
public Student(){} //顯示聲明預設構造器
//===========setter方法 由于篇幅問題,省略了 用來擷取資料的getter方法===================
public void setUser(User user) {
this.user = user;
}
public void setArr(String[] arr) {
this.arr = arr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public void setPro(Properties pro) {
this.pro = pro;
}
}
屬性注入的兩種方式
setter方法注入
User類中的幾個屬性的注入,幾個屬性都需要有setter方法
配置:
<bean id="user" class="cn.mym.entity.User">
<!-- 注入user對象中的屬性 -->
<property name="userId" value="10"></property>
<property name="username" value="123mmm"></property>
<property name="password" value="456yyy"></property>
</bean>
測試:
@Test
public void test() {
User user = (User) ac.getBean("user");
System.out.println(user);
}
結果:輸出:User [userId=10, username=123mmm, password=456yyy]
構造器注入
構造器注入基本封裝類型--注入常量
配置:
<!-- 構造器注入基本封裝類型 -->
<bean id="user1" class="cn.mym.entity.User">
<constructor-arg index="0" value="20"/>
<constructor-arg index="1" value="123m"/>
<constructor-arg index="2" value="456y"/>
</bean>
測試輸出:User [userId=20, username=123m, password=456y]
構造器注入自定義引用類型的屬性--注入變量
用Student的對象建立示範構造器注入User類型屬性
配置:
<!-- 構造器注入自定義引用類型-變量 -->
<bean id="stu" class="cn.mym.entity.Student">
<!--
通過構造器方式指定注入的bean
type:要注入的bean類型全名
ref:就是要注入的bean
-->
<constructor-arg index="0" type="cn.mym.entity.User" ref="user1"/>
</bean>
測試:
@Test
public void test() {
Student stu = (Student) ac.getBean("stu");
System.out.println(stu.getUser());
}
輸出:User [userId=20, username=123m, password=456y]
注入外部bean
注入外部bean也就是注入自定義引用類型的屬性,這裡使用Student類來說明注入user屬性
配置:
<bean id="stu1" class="cn.mym.entity.Student">
<!-- name:要注入的屬性
ref:注入的bean的id,此user1已經配置好
-->
<property name="user" ref="user1"></property>
</bean>
測試:
@Test
public void test() {
Student stu = (Student) ac.getBean("stu1");
System.out.println(stu.getUser());
}
結果:User [userId=120, username=stu1123m, password=stu1456y]
内部bean注入
即要注入的bean在内部定義
配置:
<!-- 注入内部bean -->
<bean id="stu2" class="cn.mym.entity.Student">
<property name="user">
<bean class="cn.mym.entity.User">
<!-- user的屬性注入-這裡為了篇幅注入一個 -->
<property name="username" value="one"></property>
</bean>
</property>
</bean>
測試:
@Test
public void test() {
Student stu = (Student) ac.getBean("stu2");
System.out.println(stu.getUser());
}
結果:User [userId=null, username=one, password=null]
P名稱空間注入
p 名稱空間給對象的屬性注入值(spring3.0以上版本才支援)
通過User類bean的建立來說明
配置:
首先限制要聲明p名稱空間:
xmlns:p="http://www.springframework.org/schema/p"
建立bean:
<!-- p名稱空間注入 -->
<bean id="user2" class="cn.mym.entity.User" p:username="pName"/>
測試:
@Test
public void testUser() {
User user = (User) ac.getBean("user2");
System.out.println(user);
}
結果:User [userId=null, username=pName, password=null]
注入複雜資料類型
注入數組
注入Set集合
注入List集合
注入Map集合
注入Properties類型
<!-- 注入複雜資料類型 -->
<bean id="stu3" class="cn.mym.entity.Student">
<property name="arr">
<list>
<value>a1</value>
<value>a2</value>
</list>
</property>
<property name="list">
<list>
<value>l1</value>
<value>l2</value>
</list>
</property>
<property name="set">
<set>
<value>s1</value>
<value>s2</value>
</set>
</property>
<property name="map">
<map>
<entry key="m1" value="123"/>
<entry key="m2" value="456"/>
</map>
</property>
<property name="pro">
<props>
<prop key="p1" >777</prop>
<prop key="p2" >999</prop>
</props>
</property>
</bean>
測試:
@Test
public void testStu() {
Student stu = (Student) ac.getBean("stu3");
System.out.println(stu.getArr());
System.out.println(stu.getList());
System.out.println(stu.getSet());
System.out.println(stu.getMap());
System.out.println(stu.getPro());
}
結果:
[Ljava.lang.String;@6e9ba4a9
[l1, l2]
[s1, s2]
{m1=123, m2=456}
{p2=999, p1=777}
小結:以上就是全部的依賴注入各種資料類型的多種方式,常用的就是通過setter方法進行注入,是以說過,一個類的屬性想要通過spring進行注入,需要提供:無參構造器+屬性的setter方法
spring的再次回顧總結,若有詳述不當之處,感謝您私信糾正