<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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通過呼叫構造方法為成員變數賦值
<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注入實現屬性注入大致步驟如下:
<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屬性注入的兩種方式詳解的文章就介紹到這了,更多相關Spring Bean屬性注入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45