构造函数注入是除属性注入之外的另一种常用的注入方式

构造函数注入的方法:

在类中,可以不用为属性设置setter方法,但是必须要生成该类带参数的构造方法

在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到 <constructor-arg> 节点。

constructor-arg标签属性:

name属性:通过参数名找到参数列表中对应参数;

index属性:通过参数在参数列表中的索引找到参数列表中对应参数,index从0开始;

type属性:通过参数数据类型找到参数列表中对应参数;

value属性:设置参数列表参数对应的值,用于设定基本数据类型和String类型的数据;

ref属性:如果参数值为非基本数据类型,则可通过ref为参数注入值,其值为另一个bean标签id或name

属性的属性值;

构造器注入案例:

1、编写 com.gx.model.PersonConstructor 类:

public void testPropertySetter(){

//通过Spring容器获取“personSetter”对象

PersonSetter personSetter= (PersonSetter)

context.getBean("personSetter");

System.out.println(personSetter);

}

}

package com.gx.model;

import java.io.Serializable;

public class PersonConstructor implements Serializable {

private String name;

private int age;

private double height;

private Car car;

/*使用name值也会存在歧义的情况,可以配置type属性消除歧义*/

public PersonConstructor(int name, double height, Car car) {

this.name = name+"_i2s";

this.height = height;

this.car = car;

}

public PersonConstructor(String name, int age, double height, Car car) {

this.name = name;

this.age = age;

this.height = height;this.car = car;

}

public PersonConstructor(String name, int age, Car car) {

this.name = name;

this.age = age;

this.car = car;

}

public PersonConstructor(String name, double height, Car car) {

this.name = name;

this.height = height;

this.car = car;

}

@Override

public String toString() {

return "PersonSetter{" +

"name='" + name + '\'' +

", age=" + age +

", height=" + height +

", car=" + car +

'}';

}

}

2、在applicationContext.xml中配置:

<!--构造函数注入-->

<!--通过name属性指定参数名匹配入参-->

<bean id="personConstructorByName" class="com.gx.model.PersonConstructor">

<constructor-arg name="name" value="byName匹配入参"/>

<constructor-arg name="age">

<value>22</value>

</constructor-arg>

<constructor-arg name="height" value="1.77"/>

<constructor-arg name="car" ref="carN" />

</bean>

<!--按类型匹配入参-->

<!--String name, int age, Car car-->

<bean id="personConstructorByType" class="com.gx.model.PersonConstructor">

<constructor-arg type="java.lang.String" value="按类型匹配入参"/>

<constructor-arg type="int" value="23"/>

<constructor-arg type="com.gx.model.Car" ref="car"/>

</bean>

<!--按索引匹配入参-->

<!--String name, int age, double height, Car car-->

<bean id="personConstructorByIndex" class="com.gx.model.PersonConstructor">

<constructor-arg index="0" value="按索引匹配入参"/>

<constructor-arg index="1" value="24"/>

<constructor-arg index="2" value="1.74"/>

<constructor-arg index="3" ref="carN"/>

</bean>

<!--对于由于参数数目相同而类型不同所引起的潜在配置歧义问题,

Spring容器可以正确启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,

而被选择的构造函数可能并不是用户所希望的。因此,必须特别谨慎,以避免潜在的错误。-->

<!--只按索引匹配入参有时会匹配不准确,如,我想匹配String name, int age, Car car--><bean id="personConstructorByIndexErr" class="com.gx.model.PersonConstructor">

<constructor-arg index="0" value="按索引匹配入参"/>

<!--<constructor-arg index="1" value="24" type="int"/>-->

<constructor-arg index="1" value="24" />

<constructor-arg index="2" ref="carN"/>

</bean>

<!--使用name值也会存在歧义的情况 int name, double height, Car car;

可以通过指定 type属性来消除歧义-->

<bean id="personConstructorByNameErr" class="com.gx.model.PersonConstructor">

<constructor-arg name="name" value="12345" type="int"/>

<constructor-arg name="height" value="1.78"/>

<constructor-arg name="car" ref="car"/>

</bean>

3、编写测试方法:

/**

* 构造函数注入方式测试

*/

@Test

public void testConstructor(){

// 通过name属性指定参数名匹配入参

PersonConstructor personConstructorByName

=(PersonConstructor)context.getBean("personConstructorByName");

System.out.println(personConstructorByName);

// 按类型匹配入参

PersonConstructor personConstructorByType

=(PersonConstructor) context.getBean("personConstructorByType");

System.out.println(personConstructorByType);

// 按索引匹配入参

PersonConstructor personConstructorByIndex=

(PersonConstructor) context.getBean("personConstructorByIndex");

System.out.println(personConstructorByIndex);

// 只按索引匹配入参有时会匹配不准确,如,我想匹配String name, int age, Car car,

// 结果匹配到了String name, double height, Car car

// 可以通过指定type指定具体的类型

PersonConstructor personConstructorByIndexErr=

(PersonConstructor) context.getBean("personConstructorByIndexErr");

System.out.println(personConstructorByIndexErr);

//使用name值也会存在歧义的情况 int name, double height, Car car,可以配合type属性消

除配置

PersonConstructor personConstructorByNameErr=

(PersonConstructor) context.getBean("personConstructorByNameErr");

System.out.println(personConstructorByNameErr);

}

注意: 对于由于参数数目相同(或参数名相同)而类型不同所引起的潜在配置歧义问题,Spring容器可

以正确启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,而被选择的构造函数

可能并不是用户所希望的。因此,必须特别谨慎,以避免潜在的错误。

Spring 构造器注入相关推荐

  1. Spring构造器注入循环依赖的解决方案及原理探索

    前言 我们都知道Spring解决了Setter注入或者Field注入的循环依赖问题,依靠的是三个Map(earlySingletonObjects.singletonFactories.singlet ...

  2. 对不起,我就是喜欢问你Spring构造器注入原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:这样配置:让你的 IDEA 好用到飞起来文章转自:码农沉思录 我的小站:个人小站,欢迎小憩 作者:Static_ ...

  3. Spring构造器注入

    构造器注入,那不就是使用构造方法来注入信息吗! 所以我们先来写一个带参的构造方法,看看spring的xml是如何进行配置的. 此构造方法共有三个参数 name age 和time 分别是String类 ...

  4. Spring构造函数注入和参数名称

    在运行时,除非在启用了调试选项的情况下编译类,否则Java类不会保留构造函数或方法参数的名称. 这对于Spring构造函数注入有一些有趣的含义. 考虑以下简单的类 package dbg; publi ...

  5. java设计模式之策略模式(构造器注入)

    一. 策略模式 记一次策略模式+spring构造器注入 的实现. 场景:封装一个数据库批量增删改操作的实现类,但是产品需要考虑到多种数据库.以此需要mysql批量操作的实现类,oracle的-等等主流 ...

  6. Spring官方为什么建议构造器注入?

    以下文章来源方志朋的博客,回复"666"获面试宝典 前言 本章的内容主要是想探讨我们在进行 Spring 开发过程当中,关于依赖注入的几个知识点.感兴趣的读者可以先看下以下问题: ...

  7. Spring为什么建议构造器注入?

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/6844904056230690824 前言 本章的内容主要是想探讨我们在进 ...

  8. 深度分析Spring中的构造器注入

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/z69183787/article/details/108902510 1. 示例 先来看一个例子,看看什么是构造器注入. 这里 ...

  9. spring的注入(set注入、构造器注入)

    目录 一.介绍 1.set注入和构造器注入是什么? 2.通俗的理解 3.set注入和构造器注入的核心原理 4.set注入和构造器注入的类型 5.set注入的外部bean和内部bean 二.set注入和 ...

最新文章

  1. 揭秘美国空军如何用AI技术提升“战斗力”
  2. SSM整合shiro权限框架
  3. HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)
  4. Yahoo Mail,慢功出细活〔转载〕
  5. Hibernate懒加载问题的5种解决方案
  6. 邢台职业技术学院计算机系宿舍,邢台职业技术学院宿舍条件怎么样 男生女生宿舍图片...
  7. 移动端页面0.5px border的实现
  8. java面试题_208道Java面试题,
  9. 如何在应用内设计一份调查?
  10. localhost 127.0.0.1 本机IP
  11. 微信小程序超市购物+后台管理系统|前后分离VUE
  12. matlab多行注释快捷键。
  13. 利用FPGA实现出租车计费系统
  14. 基于TTP223金属触摸开关电路模块原理图和PCB工程文件
  15. 基于51单片机的脉搏心率心跳血压体温测量检测仿真(仿真+原理图+源码+论文)
  16. platfrom设备驱动框架
  17. 基于51单片机信号发生器仿真设计
  18. uIP使用例子应用(一)
  19. python3 psycopg2查询PostgreSQL返回字典
  20. 滴滴快车VS易到“易来”到底谁便宜?结果惊呆了

热门文章

  1. 数据结构——二叉树练习题
  2. 明基PD2710QC 显示器让你的工作更便捷,更高效!
  3. thinkphp佐优家教平台网站源码 可封装成APP
  4. github pages + jekyll 构建静态网站
  5. 在线解密word文档
  6. int 10H参数详解
  7. 谈谈快消品中小饮料企业 紧俏品管理方案设计
  8. 华为交换机默认密码_华为防火墙路由器三层交换机的维护时都少不了这几条命令...
  9. 台式电脑显示配置100%请勿关闭计算机,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
  10. scikit学习心得——Isotonic Regression