[英]Using @autowire annotation in spring boot is throwing 'BeanCreationException'
[英]Overloading constructors with @autowire annotation in spring boot
如何使用@autowire
注释在spring boot 中添加新的重载构造函数?
已经公开的类的当前状态
@Component
public class PersonDetails {
private Address address;
@Autowired
public PersonDetails(Address address) {
this.address = address;
}
public void printDetails() {
System.out.println(address.toString() + " " + bankAccount.toString());
}
}
现在应该像这样添加 BankAccount 详细信息
@Component
public class PersonDetails {
private Address address;
private BankAccount bankAccount;
@Autowired
public PersonDetails(Address address) {
this.address = address;
}
@Autowired
public PersonDetails(Address address, BankAccount bankAccount) {
System.out.println("Another constructor where required is true by default");
this.address = address;
this.bankAccount = bankAccount;
}
public void printDetails() {
System.out.println(address.toString() + " " + bankAccount.toString());
}
}
问题是 spring 不允许重载构造函数@autowire
注释。
如何在具有向后兼容性的 Spring Boot 项目中添加带有@autowire
注释(或任何其他方式)的重载构造函数?
可以使用字段级@autowire
注释来完成(希望是更好的方法,因为在 Spring Boot 中不推荐使用字段级@autowire
注释),除非没有更好的方法。
根据 Spring,如果 Spring 不明显应该使用哪个构造函数,则您应该只@Autowired
一个构造函数。
Spring 将使用具有最多可与 Spring bean 匹配的参数的构造函数。 如果有两个可以匹配的参数大小相同的构造函数,则 Spring 需要@Autowired
。
关于向后兼容性:
只需删除两个@Autowired
注释。
如果不推荐使用的应用程序使用您的PersonDetails
类,它将使用第1st
构造函数,因为只能注入一个 bean。
如果最新的应用程序使用您的PersonDetails
类,它将使用2nd
构造函数,因为它将能够注入这两个 bean。
总体看一下 Spring Framework: 基于构造函数的依赖注入
特别是: Spring Beans 和依赖注入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.