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 连接到构造函数中
我有一个带有控制器的 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 连接到构造函数中