最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Bean屬性注入的兩種方式詳解

 更新時(shí)間:2022年06月11日 08:58:33   作者:倔強(qiáng)的牛角  
Spring 屬性注入(DI依賴注入)有兩種方式:setter注入,構(gòu)造器注入。本文將詳細(xì)為大家介紹一下這兩種方式的具體用法,感興趣的可以了解一下

屬性注入概念

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ù)的類型)
propertysetter注入。該元素的 name 屬性用于指定 Bean 類中相應(yīng)的屬性名(成員變量名) 。
ref<property> 和 <constructor-arg> 的子元索,用于引用指定bean實(shí)例,即 <bean> 元素中的 id 或 name 屬性。
value<property> 和 <constractor-arg> 的子元素,用于直接指定常量值。

一、構(gòu)造器注入

先來介紹下構(gòu)造器注入:Spring通過調(diào)用構(gòu)造方法為成員變量賦值

  • 使用構(gòu)造函數(shù)實(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é)果如下圖

注意點(diǎn)

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 實(shí)例化 Bean 時(shí),IoC 容器會先調(diào)用默認(rèn)構(gòu)造方法實(shí)例化 Bean,然后通過反射機(jī)制調(diào)用這個 Bean 的 setXxx() 方法,將屬性值注入到 Bean 中。

使用setter注入實(shí)現(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)造器注入行,因?yàn)槭褂胹etter注入有概率不進(jìn)行注入導(dǎo)致null對象出現(xiàn)

如果對象在創(chuàng)建過程中注入的參數(shù)可有可無 ,則可以使用setter注入

常用的是setter注入方式,有必要時(shí)可以兩者結(jié)合使用

到此這篇關(guān)于Spring Bean屬性注入的兩種方式詳解的文章就介紹到這了,更多相關(guān)Spring Bean屬性注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解Java虛擬機(jī)棧以及內(nèi)存模型

    深入了解Java虛擬機(jī)棧以及內(nèi)存模型

    這篇文章主要介紹了深入了解Java虛擬機(jī)棧以及內(nèi)存模型,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • Mybatis-plus使用注解 @TableField(exist = false)

    Mybatis-plus使用注解 @TableField(exist = false)

    這篇文章主要介紹了Mybatis-plus使用注解 @TableField(exist = false),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 淺談java常量池

    淺談java常量池

    下面小編就為大家?guī)硪黄獪\談java常量池。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • SpringBoot整合SpringDataRedis的示例代碼

    SpringBoot整合SpringDataRedis的示例代碼

    這篇文章主要介紹了SpringBoot整合SpringDataRedis的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java網(wǎng)絡(luò)編程三要素及通信程序詳解

    Java網(wǎng)絡(luò)編程三要素及通信程序詳解

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程三要素及通信程序詳解,Java網(wǎng)絡(luò)編程是在網(wǎng)絡(luò)通信協(xié)議下,實(shí)現(xiàn)網(wǎng)絡(luò)互連的不同計(jì)算機(jī)上運(yùn)行的程序間可以進(jìn)行數(shù)據(jù)交換,需要的朋友可以參考下
    2023-07-07
  • Java實(shí)現(xiàn)斗地主小游戲

    Java實(shí)現(xiàn)斗地主小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • springBoot集成flowable的流程解析

    springBoot集成flowable的流程解析

    這篇文章主要介紹了springBoot集成flowable的流程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • SpringCloud OpenFeign Post請求400錯誤解決方案

    SpringCloud OpenFeign Post請求400錯誤解決方案

    這篇文章主要介紹了SpringCloud OpenFeign Post請求400錯誤解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)

    IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)

    這篇文章主要介紹了IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java設(shè)計(jì)模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    Java設(shè)計(jì)模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    這篇文章主要介紹了Java設(shè)計(jì)模式之工廠模式,結(jié)合實(shí)例形式分析了簡單工廠、工廠方法、抽象工廠等相關(guān)功能、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下
    2018-04-04

最新評論

阳城县| 松桃| 吉木乃县| 罗定市| 家居| 香港| 烟台市| 巴彦淖尔市| 林口县| 太白县| 石林| 汕尾市| 秦皇岛市| 饶阳县| 夏津县| 宁德市| 礼泉县| 石景山区| 琼中| 滨海县| 巴南区| 怀集县| 镶黄旗| 曲阜市| 循化| 太谷县| 新乡市| 辰溪县| 当阳市| 同心县| 斗六市| 乐东| 三河市| 阿鲁科尔沁旗| 芒康县| 宜川县| 上杭县| 南汇区| 固镇县| 永兴县| 濮阳市|