java - 在 Spring Boot 中使用 @autowire 注释重载构造函数
问题描述
如何在带有@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());
}
}
现在应该像这样添加银行帐户详细信息
@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
注释。
如何@autowire
在具有向后兼容性的 Spring Boot 项目中添加带有注释(或任何其他方式)的重载构造函数?
除非没有更好的方法,否则可以使用字段级@autowire
注释来完成(希望是更好的方法,因为在 Spring Boot 中不建议使用字段级注释)。@autowire
解决方案
根据 Spring,@Autowired
如果 Spring 不明显,则应该只使用构造函数,它应该使用哪个构造函数。
Spring 将使用具有最多可与 Spring bean 匹配的参数的构造函数。如果有两个可以匹配的参数大小相等的构造函数,则 Spring 需要@Autowired
.
关于向后兼容性:
只需删除两个@Autowired
注释。
如果不推荐使用的应用程序使用您的PersonDetails
类,它将使用1st
构造函数,因为只能注入一个 bean。
如果最新的应用程序使用您的PersonDetails
类,它将使用2nd
构造函数,因为它将能够注入两个 bean。
大致看一下 Spring Framework:Constructor-based Dependency Injection
推荐阅读
- javascript - 试图获取嵌套 JSON 对象的对象键
- javascript - 如何在退出确认对话框中显示自定义消息,而不是默认浏览器消息
- java - 注释之前的方面不起作用
- java - 无法在 CircleCI 上本地安装 Selenium
- python - 需要帮助编写一个值来自文件的字典
- html - 如何在 CSS 中为背景图像设置动画?
- c++ - 通过引用传递给信号处理程序
- python - 带时区的 Python 脚本在向后移植到 python 2.7 时失败
- assembly - 在这段代码中比较 CMP AL, 1 的目的是什么?
- kubernetes - Ingress 伪造 SSL 证书