【问题标题】:Read values from yaml file从 yaml 文件中读取值
【发布时间】:2019-01-24 17:03:35
【问题描述】:

我有以下问题。我根据给定配置文件在 yaml 文件中读取的值创建数据源。

这是我的代码

@Value("${my.db.serviceId}")
private String serviceId;

@Primary
@Bean(name = "prodDataSource")
@Profile("prod")
public DataSource prodDataSource() {
    return getDataSource(serviceId);
}

@Bean(name = "devDataSource")
@Profile("dev")
public DataSource devDataSource() {
    return getDataSource(serviceId);
}

这是我的 yaml 文件

---

spring:
   profile: dev
my:
  db:
    serviceId: 'my-dev-service'
---

spring:
  profile: prod
my:
 db:
   serviceId: 'my-prod-service'

---

我当前的问题是,当我使用“dev”配置文件启动我的应用程序时, serviceId 的值为“my-prod-service”。

我在这里做错了什么?

【问题讨论】:

  • 删除 prod bean 顶部的 @primary

标签: spring-boot yaml


【解决方案1】:

@Primary 注释使 bean 在多个 bean 有资格自动装配单个值依赖项时获得首选项

所以带有@Primary注解的bean会得到更多的偏好

【讨论】:

  • 我不这么认为,@Bean(name = "prodDataSource")@Bean(name = "devDataSource") 是不同的 bean。
  • ` 假设我们有一个超类或接口,它有一些子类,所有子类都是 bean。现在在一个类中,我们有一个为超类自动装配的 setter 方法或属性。在这种情况下,所有子类都有资格进行依赖注入。因此,spring 容器会抛出错误,因为它无法选择一个 bean 进行依赖注入,因为有多个符合条件的候选者。在这种情况下,我们可以在一个子类上使用 @Primary 注释来优先选择 bean。现在将选择此 bean 进行依赖注入。`
  • 所以要多考虑一下,因为服务的价值确实决定了数据源,我认为只有数据源 bean 才有意义。并删除配置文件注释。因此,配置文件将由启动应用程序时传递的值确定。但我仍然得到相同的结果。
  • 那么它没有获取您的个人资料,您如何指定个人资料? spring.profiles.active=dev这样的
  • 这很奇怪。我正在使用以下 -Dspring.profiles.active=dev。但很奇怪,没有拿起我的个人资料。我怎样才能让它选择配置文件。
【解决方案2】:

所以我终于意识到在 yaml 文件中我放了“profile”而不是“profiles”。这就是它没有获取我的个人资料的原因。

我最终改为:

---

spring:
   profiles: dev
my:
 db:
  serviceId: 'my-dev-service'
---

spring:
   profiles: prod
my:
 db:
  serviceId: 'my-prod-service'

---

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2021-02-25
    • 2021-09-26
    • 2012-11-26
    • 2019-07-30
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多