Spring Bean屬性注入的兩種方式詳解
屬性注入概念
Spring 屬性注入(DI依賴注入)有兩種方式:setter注入,構(gòu)造器注入。
這個注入的屬性可以是普通屬性(基本數(shù)據(jù)類型與String等),也可以是一個引用數(shù)據(jù)類型(主要是對象),或者是一個集合(list、map、set等)
下表是屬性注入bean標(biāo)簽中常用的元素
| 元素名稱 | 描述 |
|---|---|
| constructor-arg | 構(gòu)造器注入。該元素的 index 屬性指定構(gòu)造參數(shù)的索引(從 0 開始),type 屬性指定構(gòu)造參數(shù)的類型(type也可以不寫,spring會自動識別參數(shù)的類型) |
| property | setter注入。該元素的 name 屬性用于指定 Bean 類中相應(yīng)的屬性名(成員變量名) 。 |
| ref | <property> 和 <constructor-arg> 的子元索,用于引用指定bean實例,即 <bean> 元素中的 id 或 name 屬性。 |
| value | <property> 和 <constractor-arg> 的子元素,用于直接指定常量值。 |
一、構(gòu)造器注入
先來介紹下構(gòu)造器注入:Spring通過調(diào)用構(gòu)造方法為成員變量賦值
- 使用構(gòu)造函數(shù)實現(xiàn)屬性注入大致步驟如下:
- 在類中添加一個有參構(gòu)造方法,構(gòu)造方法內(nèi)的每一個參數(shù)代表一個需要注入的屬性;
- 在 Spring 的配置文件中定義Bean;
- 在 <bean> 元素內(nèi)使用
<constructor-arg>元素,對構(gòu)造函數(shù)內(nèi)的屬性進(jìn)行賦值,Bean 的構(gòu)造方法內(nèi)有多少參數(shù),就需要使用多少個 <constructor-arg> 元素。
下面通過示例介紹如何使用構(gòu)造器注入
示例1
1.創(chuàng)建員工類Employee和部門類Dept,并添加有參構(gòu)造方法(關(guān)鍵!)
/*員工類Employee*/
public class Employee {
//員工編號
private String empNo;
//員工姓名
private String empName;
//部門信息
private Dept dept;
//有參構(gòu)造方法
public Employee(String empNo, String empName, Dept dept) {
this.empNo = empNo;
this.empName = empName;
this.dept = dept;
}
----省略toString方法------
}
/*部門類Dept*/
public class Dept {
//部門編號
private String deptNo;
//部門名稱
private String deptName;
//有參構(gòu)造方法
public Dept(String deptNo, String deptName) {
this.deptNo = deptNo;
this.deptName = deptName;
}
----省略toString方法------
}
2.編寫spring配置文件
<!--部門類屬性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="后端組"/>
</bean>
<!--員工類屬性注入-->
<bean id="employee" class="com.bighorn.pojo.Employee">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="bighorn"/>
<constructor-arg index="2" ref="dept"/>
</bean>
3.編寫運(yùn)行程序
public static void main(String[] args) {
//獲取IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從容器中獲取對象
Employee employee = context.getBean("employee", Employee.class);
System.out.println(employee);
}
結(jié)果如下圖

注意點
spring識別有參構(gòu)造方法的參數(shù)的三種形式:
1.以index識別,案例一就是如此
<bean id="dept" class="com.bighorn.pojo.Dept">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="后端組"/>
</bean>
2.以name識別,如下
<bean id="dept" class="com.bighorn.pojo.Dept">
<constructor-arg name="deptNo" value="1"/>
<constructor-arg name="deptName" value="后端組"/>
</bean>
3.以type識別,如下
<bean id="dept" class="com.bighorn.pojo.Dept">
<constructor-arg type="int" value="1"/>
<constructor-arg type="java.lang.String" value="后端組"/>
</bean>
三種形式各有各的好處和壞處。
以type識別不適合有多個參數(shù)類型相同的情況;以index形式識別,如果參數(shù)順序變了又要重改;以name形式識別,如果參數(shù)名變了也要重改??傊?,都不太利于解耦
二、setter注入
下面來介紹下setter注入:Spring通過調(diào)用setter方法為成員變量賦值。
在【Spring學(xué)習(xí)筆記(二)】提到過,在 Spring 實例化 Bean 時,IoC 容器會先調(diào)用默認(rèn)構(gòu)造方法實例化 Bean,然后通過反射機(jī)制調(diào)用這個 Bean 的 setXxx() 方法,將屬性值注入到 Bean 中。
使用setter注入實現(xiàn)屬性注入大致步驟如下:
- 在 類中提供一個默認(rèn)的無參構(gòu)造方法(在沒有帶參構(gòu)造方法的情況下,可省略),并為所有需要注入的屬性提供一個 setter 方法;
- 在 Spring 的 XML 配置文件中定義Bean;
- 使用
<property>元素對各個屬性進(jìn)行賦值。
下面通過示例介紹如何使用setter注入方法
示例2
1.創(chuàng)建員工類Employee和部門類Dept,與示例一不同的是,需要添加各個成員變量的setter方法,也需要提供一個無參構(gòu)造方法
/*員工類Employee*/
public class Employee {
//員工編號
private String empNo;
//員工姓名
private String empName;
//部門信息
private Dept dept;
//無參構(gòu)造方法,在沒有其他帶參構(gòu)造方法的情況下,可以省略
public Employee() {
}
//各個屬性的setter方法
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public void setDept(Dept dept) {
this.dept = dept;
}
----省略toString方法------
}
/*部門類Dept*/
public class Dept {
//部門編號
private String deptNo;
//部門名稱
private String deptName;
//無參構(gòu)造方法,在沒有其他帶參構(gòu)造方法的情況下,可以省略
public Dept() {
}
//各個屬性的setter方法
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
----省略toString方法------
}
2.編寫spring配置文件
<!--使用 property 元素完成屬性注入
name: pojo類中的屬性名稱
value: 向?qū)傩宰⑷氲闹?
-->
<!--部門類屬性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
<property name="deptNo" value="2"/>
<property name="deptName" value="前端組"/>
</bean>
<!--員工類屬性注入-->
<bean id="employee" class="com.bighorn.pojo.Employee">
<property name="empNo" value="114514"/>
<property name="empName" value="lzh"/>
<property name="dept" ref="dept"/>
</bean>
3.編寫運(yùn)行程序
public static void main(String[] args) {
//獲取IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從容器中獲取對象
Employee employee = context.getBean("employee", Employee.class);
System.out.println(employee);
}
結(jié)果如下圖

三、如何選擇注入方式
如果對象在創(chuàng)建的過程中必須要注入指定的參數(shù),則可以使用構(gòu)造器注入行,因為使用setter注入有概率不進(jìn)行注入導(dǎo)致null對象出現(xiàn)
如果對象在創(chuàng)建過程中注入的參數(shù)可有可無 ,則可以使用setter注入
常用的是setter注入方式,有必要時可以兩者結(jié)合使用
到此這篇關(guān)于Spring Bean屬性注入的兩種方式詳解的文章就介紹到這了,更多相關(guān)Spring Bean屬性注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中CopyOnWriteArrayList的使用解析
這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場景里,比如緩存,它不存在擴(kuò)容的概念,每次寫操作都要復(fù)制一個副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下2023-12-12
BufferedWriter如何使用write方法實現(xiàn)換行
這篇文章主要介紹了BufferedWriter如何使用write方法實現(xiàn)換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱
這篇文章主要介紹了java數(shù)據(jù)類型轉(zhuǎn)換的一些陷阱,包括基本數(shù)據(jù)類型轉(zhuǎn)換列表陷阱,基本上這一篇就把常見的問題就給大家分享一下2020-10-10
Mybatis?sqlMapConfig.xml中的mappers標(biāo)簽使用
這篇文章主要介紹了Mybatis?sqlMapConfig.xml中的mappers標(biāo)簽使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01
spring基礎(chǔ)概念A(yù)OP與動態(tài)代理理解
這篇文章主要為大家詳細(xì)介紹了spring基礎(chǔ)概念A(yù)OP與動態(tài)代理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10

