Java 在spring boot中使用@autowire注释重载构造函数

Java 在spring boot中使用@autowire注释重载构造函数,java,spring,spring-boot,Java,Spring,Spring Boot,如何使用@autowire注释在spring boot中添加新的重载构造函数 已公开的类的当前状态 @Component public class PersonDetails { private Address address; @Autowired public PersonDetails(Address address) { this.address = address; } public void printDetails()

如何使用
@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
注释

如何在具有向后兼容性的spring boot项目中添加带有
@autowire
注释(或任何其他方式)的重载构造函数


它可以通过字段级的
@autowire
注释来完成(希望是更好的方法,因为在spring boot中不建议使用字段级的
@autowire
注释),除非没有更好的方法。

根据spring的说法,如果对spring不明显,您应该只使用
@Autowired
构造函数,它应该使用哪个构造函数

Spring将使用具有最多可与Springbean匹配的参数的构造函数。如果有两个参数大小相同的构造函数可以匹配,Spring需要
@Autowired

关于向后兼容性:

只需删除两个
@Autowired
注释即可

如果不推荐使用的应用程序使用您的
PersonDetails
类,它将使用
1st
构造函数,因为只能注入一个bean

如果最新的应用程序使用您的
PersonDetails
类,它将使用
Second
构造函数,因为它将能够注入这两个bean

总体上看一下Spring框架:


特别是:

虽然从技术上解决了这个问题,但由于引入了新参数,客户机测试用例需要更新。谢谢你抽出时间。我已经更新了我的答案,也许这对你有点帮助。这看起来像是一个一开始就不应该有任何自动连线的类!。您应该对应用程序组件使用自动布线,这看起来像是被硬塞进自动布线的DTO。