欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

屬性注入概念

Spring 屬性注入(DI依賴注入)有兩種方式:setter注入,構造器注入

這個注入的屬性可以是普通屬性(基本數據類型與String等),也可以是一個引用數據類型(主要是對象),或者是一個集合(list、map、set等)

下表是屬性注入bean標簽中常用的元素

元素名稱描述
constructor-arg構造器注入。該元素的 index 屬性指定構造參數的索引(從 0 開始),type 屬性指定構造參數的類型(type也可以不寫,spring會自動識別參數的類型)
propertysetter注入。該元素的 name 屬性用于指定 Bean 類中相應的屬性名(成員變量名) 。
ref<property> 和 <constructor-arg> 的子元索,用于引用指定bean實例,即 <bean> 元素中的 id 或 name 屬性。
value<property> 和 <constractor-arg> 的子元素,用于直接指定常量值。

一、構造器注入

先來介紹下構造器注入:Spring通過調用構造方法為成員變量賦值

  • 使用構造函數實現屬性注入大致步驟如下:
  • 在類中添加一個有參構造方法,構造方法內的每一個參數代表一個需要注入的屬性;
  • 在 Spring 的配置文件中定義Bean;
  • 在 <bean> 元素內使用 <constructor-arg> 元素,對構造函數內的屬性進行賦值,Bean 的構造方法內有多少參數,就需要使用多少個 <constructor-arg> 元素。

下面通過示例介紹如何使用構造器注入

示例1

1.創(chuàng)建員工類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注入

下面來介紹下setter注入:Spring通過調用setter方法為成員變量賦值。

【Spring學習筆記(二)】提到過,在 Spring 實例化 Bean 時,IoC 容器會先調用默認構造方法實例化 Bean,然后通過反射機制調用這個 Bean 的 setXxx() 方法,將屬性值注入到 Bean 中。

使用setter注入實現屬性注入大致步驟如下:

  • 在 類中提供一個默認的無參構造方法(在沒有帶參構造方法的情況下,可省略),并為所有需要注入的屬性提供一個 setter 方法;
  • 在 Spring 的 XML 配置文件中定義Bean
  • 使用 <property> 元素對各個屬性進行賦值。

下面通過示例介紹如何使用setter注入方法

示例2

1.創(chuàng)建員工類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);
}

結果如下圖

三、如何選擇注入方式

如果對象在創(chuàng)建的過程中必須要注入指定的參數,則可以使用構造器注入行,因為使用setter注入有概率不進行注入導致null對象出現

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

常用的是setter注入方式,有必要時可以兩者結合使用

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

相關文章

  • Java redisTemplate阻塞式處理消息隊列

    Java redisTemplate阻塞式處理消息隊列

    用redis中的List可以實現隊列,這樣可以用來做消息處理和任務調度的隊列。因此,本文將主要為大家介紹如何利用redisTemplate處理消息隊列,感興趣的小伙伴可以了解一下
    2021-12-12
  • Java中CopyOnWriteArrayList的使用解析

    Java中CopyOnWriteArrayList的使用解析

    這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠遠大于寫操作的場景里,比如緩存,它不存在擴容的概念,每次寫操作都要復制一個副本,在副本的基礎上修改后改變Array引用,需要的朋友可以參考下
    2023-12-12
  • BufferedWriter如何使用write方法實現換行

    BufferedWriter如何使用write方法實現換行

    這篇文章主要介紹了BufferedWriter如何使用write方法實現換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 從Java到JSON一起探索Jackson的魔力

    從Java到JSON一起探索Jackson的魔力

    Jackson是一個用于處理JSON數據的開源Java庫,這篇文章主要為大家介紹了Java是如何利用Jackson處理JSON數據的,感興趣的小伙伴可以了解一下
    2023-05-05
  • Java 中運行字符串表達式的方法

    Java 中運行字符串表達式的方法

    這篇文章主要介紹了Java 中運行字符串表達式的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • java數據類型轉換陷阱包括列表陷阱

    java數據類型轉換陷阱包括列表陷阱

    這篇文章主要介紹了java數據類型轉換的一些陷阱,包括基本數據類型轉換列表陷阱,基本上這一篇就把常見的問題就給大家分享一下
    2020-10-10
  • Springboot中使用lombok的@Data注解方式

    Springboot中使用lombok的@Data注解方式

    這篇文章主要介紹了Springboot中使用lombok的@Data注解方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis?sqlMapConfig.xml中的mappers標簽使用

    Mybatis?sqlMapConfig.xml中的mappers標簽使用

    這篇文章主要介紹了Mybatis?sqlMapConfig.xml中的mappers標簽使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java 8中日期和時間的處理方法

    Java 8中日期和時間的處理方法

    Java 8新增了LocalDate和LocalTime接口,接下來通過本文給大家介紹Java 8中日期和時間的處理方法,非常不錯,感興趣的朋友一起看下吧
    2016-08-08
  • spring基礎概念AOP與動態(tài)代理理解

    spring基礎概念AOP與動態(tài)代理理解

    這篇文章主要為大家詳細介紹了spring基礎概念AOP與動態(tài)代理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論