Spring 引导:使用配置文件中 class 的自动装配构造函数

Spring Boot: use autowired constructor with class from configuration file

我有一个带有控制器的 Spring Boot 2.3 应用程序:

@RestController
public class StatusController {

    private final ServerStatusCheck serverStatusCheck;
    private final ServerStatusMapper serverStatusMapper;

    @Autowired
    public StatusController(AService aService, ServerStatusMapper serverStatusMapper) {
        this.serverStatusCheck = aService;
        this.serverStatusMapper = serverStatusMapper;
    }

    // (...)
}

class AService 实现了 ServerStatusCheck 接口。还有一个 BService class,同样实现了 ServerStatusCheck 接口。

我需要做什么:注入的 AService 对象应该可以在配置文件中配置,以便注入的服务是 "AService" 或 "BService",具体取决于配置文件的值。使用 Spring Boot 实现此目的的最佳方法是什么?如果可能的话,我想保留基于构造函数的自动装配(而不是基于字段的自动装配)。

您可以在配置 class 中创建不同的 bean,条件如 https://reflectoring.io/spring-boot-conditionals/

@Configuration
public class ServiceConfiguration {

   @ConditionalOnProperty(value="service.a.enabled", havingValue = "true", matchIfMissing = true)
   public ServerStatusCheck serverStatusCheckA() {
      return new AService();
   }

   @ConditionalOnMissingBean
   @ConditionalOnProperty(value="service.b.enabled", havingValue = "true", matchIfMissing = true)
   public ServerStatusCheck serverStatusCheckB() {
      return new BService();
   }
}

然后将 bean 连接到构造函数中