spring 构造函数注入

在运行时,除非在启用了调试选项的情况下编译类,否则Java类不会保留构造函数或方法参数的名称。

这对于Spring构造函数注入有一些有趣的含义。

考虑以下简单的类

package dbg;
public class Person {private final String first;private final String last;private final Address address;public Person(String first, String last, Address address){this.first = first;this.last = last;this.address = address;}public String getFirst() {return first;}public String getLast() {return last;}public Address getAddress() {return address;}
}

和一个示例Spring bean配置xml文件:

<bean name='address1' class='dbg.Address' p:street1='street1' p:street2='street1' p:state='state1'/><bean name='person1' class='dbg.Person' c:address-ref='address1' c:last='Last1' c:first='First1'  ></bean><bean name='person2' class='dbg.Person' c:first='First2' c:address-ref='address1' c:last='Last2'   ></bean>

在这里,我使用c名称空间进行构造函数注入。 失败的原因是参数类型不明确-这是因为第一个参数是String,并且由于其运行时表示中不存在参数名称,因此Spring无法确定应使用名称还是姓氏代替它。 这种情况下有几个修复方法:1.要使用基于索引的构造函数注入,虽然缺点是非常冗长:

<bean name='person1' class='dbg.Person' ><constructor-arg value='First1'></constructor-arg><constructor-arg value='Last1'></constructor-arg><constructor-arg ref='address1'></constructor-arg></bean><bean name='person2' class='dbg.Person' ><constructor-arg value='First2'></constructor-arg><constructor-arg value='Last2'></constructor-arg><constructor-arg ref='address1'></constructor-arg></bean>

2.要使用调试符号进行编译,可以通过向Java编译器传递-g或-g:var标志来完成–这将确保参数名称保留在类文件中,并使用c保留原始的简洁bean配置。名称空间将起作用。 3.巧妙的解决方法是使用@ConstructorProperties注释构造函数,该结构基本上为Spring提供参数名称:

public class Person {private final String first;private final String last;private final Address address;@ConstructorProperties({'first','last','address'})public Person(String first, String last, Address address){this.first = first;this.last = last;this.address = address;}

无论打开或不打开调试选项,此功能都可以使用。 4.可能最好的解决方法是简单地使用@Configuration定义bean:

@Configuration
public static class TestConfiguration{@Beanpublic Address address1(){return new Address();}@Beanpublic Person person1(){return new Person('First1', 'Last1', address1());}@Beanpublic Person person2(){return new Person('First2', 'Last2', address1());}}

参考: all和其他博客中来自JCG合作伙伴 Biju Kunjummen的Spring构造函数注入和参数名称 。

翻译自: https://www.javacodegeeks.com/2012/10/spring-constructor-injection-and-argument-names.html

spring 构造函数注入

spring 构造函数注入_Spring构造函数注入和参数名称相关推荐

  1. spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入

    spring 构造函数注入 欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们 ...

  2. java应用中spring自动注入_Spring自动注入的几种方式

    ---恢复内容开始--- @Service("accountEmailService") public class AccountEmailServiceImpl implemen ...

  3. spring依赖注入_Spring依赖注入

    spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...

  4. spring依赖注入_Spring依赖注入技术的发展

    spring依赖注入 回顾Spring框架的历史,您会发现在每个发行版中实现依赖注入的方法越来越多. 如果您使用该框架已经超过一个月,那么在这篇回顾性文章中可能不会发现任何有趣的东西. 除了Scala ...

  5. spring 构造函数注入_Spring构造函数依赖注入示例

    spring 构造函数注入 欢迎使用Spring构造函数依赖注入示例指南. 基于构造器的依赖注入是Spring 依赖注入的一种 . 依赖注入的另一种类型是Setter注入和字段注入. 有关Spring ...

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

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

  7. 踩坑:Spring静态变量/构造函数注入失败(注入为null)问题的解决方案

    1.案例1:Spring对静态变量的注入为空 案例代码如下: @Component public class HelloWorld {/*** 错误案例:这种方式是不能给静态变量注入属性值的*/@Va ...

  8. spring依赖注入_Spring的依赖注入陷阱

    spring依赖注入 Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法. 例如现场注入: @Aut ...

  9. spring 依赖注入_Spring从入门到入土——依赖注入(DI)

    Dependency Injection 概念 依赖注入(DI) 依赖:指Bean对象的创建依赖于容器.Bean对象的依赖资源 注入:指Bean对象 注入方式 一共有三种:分别是构造器注入:Set注入 ...

最新文章

  1. c语言英文字符转数字,C语言常用数字和字符串转换函数(国外英文资料).doc
  2. html tfoot标签,HTML tfoot 标签
  3. CUDA error: an illegal memory access was encountered
  4. android wifi动画显示,android动态配置Wifi信息
  5. python控制台输出到文件_Python print 立即打印内容到重定向的文件
  6. C#使用事件方式Winform窗体之间传值
  7. spark.mllib:回归算法
  8. Java数组排序解码
  9. 嗅探TFTP配置文件传输
  10. 厉害了!20年【科比NBA】生涯|数据分析
  11. 二层、三层与四层交换机
  12. Ansible最佳实践之委派任务和事实
  13. 怎么注册微软云服务器,如何创建和部署云服务(经典) | Microsoft Docs
  14. SQL server学习日志(二)创建表!手把手教你创建表,修改表,了解数据类型!超详细!
  15. 微信APP支付之IJpay的使用
  16. oracle 序列和表关联,Oracle 创建和管理表、集群和序列
  17. 苹果电脑装双系统Parallels Desktop虚拟机你需要知道,是否适合装虚拟机?
  18. 控制工程中的数学建模(3)——自动控制系统的一般模型
  19. C语言实现,输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
  20. Qt TCP文件传输工具 源码分享

热门文章

  1. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制
  2. Java IO: InputStreamReader和OutputStreamWriter
  3. java人脸识别更新:摄像头支持360、火狐和谷歌浏览器
  4. 新闻发布项目——接口类(categoryTBDao)
  5. SSM整合简单登录案例
  6. 数组遍历VS对象遍历
  7. zookeeper 屁民
  8. 计算机网络协议和通信规则,计算机网络协议基本知识
  9. 我的控制反转,依赖注入和面向切面编程的理解
  10. XML—— 验证XML文档