Spring 构造器注入
构造函数注入是除属性注入之外的另一种常用的注入方式
构造函数注入的方法:
在类中,可以不用为属性设置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 构造器注入相关推荐
- Spring构造器注入循环依赖的解决方案及原理探索
前言 我们都知道Spring解决了Setter注入或者Field注入的循环依赖问题,依靠的是三个Map(earlySingletonObjects.singletonFactories.singlet ...
- 对不起,我就是喜欢问你Spring构造器注入原理
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:这样配置:让你的 IDEA 好用到飞起来文章转自:码农沉思录 我的小站:个人小站,欢迎小憩 作者:Static_ ...
- Spring构造器注入
构造器注入,那不就是使用构造方法来注入信息吗! 所以我们先来写一个带参的构造方法,看看spring的xml是如何进行配置的. 此构造方法共有三个参数 name age 和time 分别是String类 ...
- Spring构造函数注入和参数名称
在运行时,除非在启用了调试选项的情况下编译类,否则Java类不会保留构造函数或方法参数的名称. 这对于Spring构造函数注入有一些有趣的含义. 考虑以下简单的类 package dbg; publi ...
- java设计模式之策略模式(构造器注入)
一. 策略模式 记一次策略模式+spring构造器注入 的实现. 场景:封装一个数据库批量增删改操作的实现类,但是产品需要考虑到多种数据库.以此需要mysql批量操作的实现类,oracle的-等等主流 ...
- Spring官方为什么建议构造器注入?
以下文章来源方志朋的博客,回复"666"获面试宝典 前言 本章的内容主要是想探讨我们在进行 Spring 开发过程当中,关于依赖注入的几个知识点.感兴趣的读者可以先看下以下问题: ...
- Spring为什么建议构造器注入?
以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/6844904056230690824 前言 本章的内容主要是想探讨我们在进 ...
- 深度分析Spring中的构造器注入
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/z69183787/article/details/108902510 1. 示例 先来看一个例子,看看什么是构造器注入. 这里 ...
- spring的注入(set注入、构造器注入)
目录 一.介绍 1.set注入和构造器注入是什么? 2.通俗的理解 3.set注入和构造器注入的核心原理 4.set注入和构造器注入的类型 5.set注入的外部bean和内部bean 二.set注入和 ...
最新文章
- 揭秘美国空军如何用AI技术提升“战斗力”
- SSM整合shiro权限框架
- HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)
- Yahoo Mail,慢功出细活〔转载〕
- Hibernate懒加载问题的5种解决方案
- 邢台职业技术学院计算机系宿舍,邢台职业技术学院宿舍条件怎么样 男生女生宿舍图片...
- 移动端页面0.5px border的实现
- java面试题_208道Java面试题,
- 如何在应用内设计一份调查?
- localhost 127.0.0.1 本机IP
- 微信小程序超市购物+后台管理系统|前后分离VUE
- matlab多行注释快捷键。
- 利用FPGA实现出租车计费系统
- 基于TTP223金属触摸开关电路模块原理图和PCB工程文件
- 基于51单片机的脉搏心率心跳血压体温测量检测仿真(仿真+原理图+源码+论文)
- platfrom设备驱动框架
- 基于51单片机信号发生器仿真设计
- uIP使用例子应用(一)
- python3 psycopg2查询PostgreSQL返回字典
- 滴滴快车VS易到“易来”到底谁便宜?结果惊呆了
热门文章
- 数据结构——二叉树练习题
- 明基PD2710QC 显示器让你的工作更便捷,更高效!
- thinkphp佐优家教平台网站源码 可封装成APP
- github pages + jekyll 构建静态网站
- 在线解密word文档
- int 10H参数详解
- 谈谈快消品中小饮料企业 紧俏品管理方案设计
- 华为交换机默认密码_华为防火墙路由器三层交换机的维护时都少不了这几条命令...
- 台式电脑显示配置100%请勿关闭计算机,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
- scikit学习心得——Isotonic Regression