您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring Bean屬性注入的方式有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring Bean屬性注入的方式有哪些”文章能幫助大家解決問題。
Spring 屬性注入(DI依賴注入)有兩種方式:setter注入,構造器注入。
這個注入的屬性可以是普通屬性(基本數據類型與String等),也可以是一個引用數據類型(主要是對象),或者是一個集合(list、map、set等)
下表是屬性注入bean標簽中常用的元素
元素名稱 | 描述 |
---|---|
constructor-arg | 構造器注入。該元素的 index 屬性指定構造參數的索引(從 0 開始),type 屬性指定構造參數的類型(type也可以不寫,spring會自動識別參數的類型) |
property | setter注入。該元素的 name 屬性用于指定 Bean 類中相應的屬性名(成員變量名) 。 |
ref | <property> 和 <constructor-arg> 的子元索,用于引用指定bean實例,即 <bean> 元素中的 id 或 name 屬性。 |
value | <property> 和 <constractor-arg> 的子元素,用于直接指定常量值。 |
先來介紹下構造器注入
:Spring通過調用構造方法為成員變量賦值
使用構造函數實現屬性注入大致步驟如下:
在類中添加一個有參構造方法,構造方法內的每一個參數代表一個需要注入的屬性;
在 Spring 的配置文件中定義Bean;
在 <bean> 元素內使用 <constructor-arg>
元素,對構造函數內的屬性進行賦值,Bean 的構造方法內有多少參數,就需要使用多少個 <constructor-arg> 元素。
下面通過示例介紹如何使用構造器注入
1.創建員工類Employee和部門類Dept,并添加有參構造方法(關鍵!)
/*員工類Employee*/ public class Employee { //員工編號 private String empNo; //員工姓名 private String empName; //部門信息 private Dept dept; //有參構造方法 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; //有參構造方法 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.編寫運行程序
public static void main(String[] args) { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取對象 Employee employee = context.getBean("employee", Employee.class); System.out.println(employee); }
結果如下圖
spring識別有參構造方法的參數的三種形式:
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識別不適合有多個參數類型相同的情況;以index形式識別,如果參數順序變了又要重改;以name形式識別,如果參數名變了也要重改。總之,都不太利于解耦
下面來介紹下setter注入:Spring通過調用setter方法為成員變量賦值。
在【Spring學習筆記(二)】提到過,在 Spring 實例化 Bean 時,IoC 容器會先調用默認構造方法實例化 Bean,然后通過反射機制調用這個 Bean 的 setXxx() 方法,將屬性值注入到 Bean 中。
使用setter注入實現屬性注入大致步驟如下:
在 類中提供一個默認的無參構造方法(在沒有帶參構造方法的情況下,可省略),并為所有需要注入的屬性提供一個 setter 方法;
在 Spring 的 XML 配置文件中定義Bean;
使用 <property>
元素對各個屬性進行賦值。
下面通過示例介紹如何使用setter注入方法
1.創建員工類Employee和部門類Dept,與示例一不同的是,需要添加各個成員變量的setter方法,也需要提供一個無參構造方法
/*員工類Employee*/ public class Employee { //員工編號 private String empNo; //員工姓名 private String empName; //部門信息 private Dept dept; //無參構造方法,在沒有其他帶參構造方法的情況下,可以省略 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; //無參構造方法,在沒有其他帶參構造方法的情況下,可以省略 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: 向屬性注入的值 --> <!--部門類屬性注入--> <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.編寫運行程序
public static void main(String[] args) { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取對象 Employee employee = context.getBean("employee", Employee.class); System.out.println(employee); }
結果如下圖
如果對象在創建的過程中必須要注入指定的參數,則可以使用構造器注入行,因為使用setter注入有概率不進行注入導致null對象出現
如果對象在創建過程中注入的參數可有可無 ,則可以使用setter注入
常用的是setter注入方式,有必要時可以兩者結合使用
關于“Spring Bean屬性注入的方式有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。