Spring Bean属性注入的两种方式详解

网友投稿 304 2022-07-24


目录属性注入概念一、构造器注入示例1注意点二、setter注入示例2三、如何选择注入方式

属性注入概念

Spring 属性注入(DI依赖注入)有两种方式:setter注入,构造器注入。

这个注入的属性可以是普通属性(基本数据类型与String等),也可以是一个引用数据类型(主要是对象),或者是一个集合(list、map、set等)

下表是属性注入bean标签中常用的元素

元素名称描述constructor-arg构造器注入。该元素的 index 属性指定构造参数的索引(从 0 开始),type 属性指定构造参数的类型(type也可以不写,spring会自动识别参数的类型)propertysetter注入。该元素的 name 属性用于指定 Bean 类中相应的属性名(成员变量名) 。ref 的子元索,用于引用指定bean实例,即 元素中的 id 或 name 属性。value 的子元素,用于直接指定常量值。

一、构造器注入

先来介绍下构造器注入:Spring通过调用构造方法为成员变量赋值

使用构造函数实现属性注入大致步骤如下:

在类中添加一个有参构造方法,构造方法内的每一个参数代表一个需要注入的属性;在 Spring 的配置文件中定义Bean;在 元素内使用 元素,对构造函数内的属性进行赋值,Bean 的构造方法内有多少参数,就需要使用多少个 元素。

下面通过示例介绍如何使用构造器注入

示例1

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配置文件

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识别,案例一就是如此

2.以name识别,如下

3.以type识别,如下

三种形式各有各的好处和坏处。以type识别不适合有多个参数类型相同的情况;以index形式识别,如果参数顺序变了又要重改;以name形式识别,如果参数名变了也要重改。总之,都不太利于解耦

二、setter注入

下面来介绍下setter注入:Spring通过调用setter方法为成员变量赋值。

在【Spring学习笔记(二)】提到过,在 Spring 实例化 Bean 时,IoC 容器会先调用默认构造方法实例化 Bean,然后通过反射机制调用这个 Bean 的 setXxx() 方法,将属性值注入到 Bean 中。

使用setter注入实现属性注入大致步骤如下:

在 类中提供一个默认的无参构造方法(在没有带参构造方法的情况下,可省略),并为所有需要注入的属性提供一个 setter 方法;在 Spring 的 XML 配置文件中定义Bean;使用 元素对各个属性进行赋值。

下面通过示例介绍如何使用setter注入方法

示例2

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 StrinzyBlLgONiYg deptName;

//无参构造方法,在没有其他带参构造方法的情况下,可以省略

public Dept() {

}

//各个属性的setter方法

public void setDeptNo(int deptNo) {

this.deptNo = deptNo;

}

public void setDeptName(String deptName) {

this.deptName = deptName;

}

----省略toString方法------

}

2.编写spring配置文件

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注入方式,有必要时可以两者结合使用


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Spring Bean的集合注入和自动装配
下一篇:Java实现简单小画板
相关文章

 发表评论

暂时没有评论,来抢沙发吧~