【问题标题】:Inject with Spring Boot depending on properties from application.yml根据 application.yml 的属性注入 Spring Boot
【发布时间】:2018-01-04 06:04:34
【问题描述】:

在我们项目的一个通用库中,我需要根据 Service 使用的接口来区分接口的两种实现。

我通过构造函数注入来注入这个接口,并且需要找出如何根据我们的 application.yml 中的属性值来确定使用什么实现。

我查看了@Qualifier 注释,但这似乎确实需要 xml 模式中的属性。我们没有这样的东西。

在我们的代码的一部分中,我们以这种方式读出了 KafkaListener 的属性

@KafkaListener(topics = "#{PathToProperties.getPrefix()}#OurBusinessProperties.getRelevantProperties()}" 

我可以在 Spring 中使用相同的语法吗?

【问题讨论】:

  • 检查 Spring 中的 @Value 注释,与 SpEL 表达式混合。根据该值,您可以手动从上下文中获取 bean。

标签: java spring spring-boot dependency-injection yaml


【解决方案1】:

在我们项目的一个公共库中,我需要创建一个 基于什么来区分接口的两种实现 服务正在使用它。

您可以使用配置文件来执行此操作。

假设您有两个配置文件:productiontest

然后您可以像这样注释要在生产中使用的实现:

@Profile("production")
@Component
class ProductionImplementation implements MyService {
}

并在另一个组件上设置不同的配置文件:

@Profile("test")
@Component
class TestImplementation implements MyService {
}

然后使用以下参数启动您的 spring-boot 应用程序:

-Dspring.profiles.active=production

或者,您可以使用环境变量选择配置文件:

SPRING_PROFILES_ACTIVE = production

另一种选择是创建一个工厂,该工厂将根据某些环境配置创建不同的实例:

@Bean
public MyService myService() {
  if (condition) return FirstImplementation();
  return SecondImplementation();
}

【讨论】:

  • 谢谢,这已经非常有用了。但是我已经在开发、测试、本地、docker 的两个应用程序中都有配置文件。像这样:spring:profiles:development kafka:bootstrap-servers:'kafka.development:9092'我可以添加一些东西吗?因为使用此库的两个应用程序具有相同的配置文件。也许有一个话题?
  • 您始终可以创建一个工厂,该工厂将根据某些环境配置创建不同的实例。我已经更新了答案。
  • 谢谢,与@Value 注释结合使用效果很好
猜你喜欢
  • 2014-09-15
  • 2014-12-22
  • 2018-10-11
  • 2019-05-09
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多