繁体   English   中英

在 Spring Boot 中使用 @autowire 注释重载构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM