spring 构造函数注入_Spring构造函数注入和参数名称

当Java类在没有启用调试选项的情况下编译时,构造函数或方法参数的名称不会被保留,这对Spring的构造函数注入带来挑战。文章通过一个简单的类示例和Spring bean配置XML文件,阐述了由于参数类型不明确导致的注入问题。解决方案包括:基于索引的注入、使用调试符号编译、使用@ConstructorProperties注解以及通过@Configuration定义bean。最佳实践推荐使用@Configuration。
摘要由CSDN通过智能技术生成

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{

 @Bean
 public Address address1(){
  return new Address();
 }
 @Bean
 public Person person1(){
  return new Person('First1', 'Last1', address1());
 }
 @Bean
 public 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 构造函数注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值