【问题标题】:@Refreshscope with Datasource configuration@Refreshscope 与数据源配置
【发布时间】:2017-08-30 05:27:12
【问题描述】:

我在 Spring Boot 应用程序中有一个数据源配置类。下面的片段

我的配置是从 Spring 云配置服务器获取的。当我更改我的数据库主机名并使用 /refresh 端点刷新时,该应用程序未使用新的数据库主机。知道为什么吗?

@Configuration
@RefreshScope
public classe DBConfig
{
  @Resource
    private Environment env;

   private DataSource ehubDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.driverClassName"));
        dataSource
                .setUrl(env.getProperty("datasource.url"));
        dataSource.setUsername(env.getProperty("datasource.username"));
        dataSource.setPassword(env.getProperty("datasource.password"));
        return dataSource;
    }

}

【问题讨论】:

  • 我不确定,但我认为您需要销毁范围/对象(在更改时)并重新创建它以反映
  • @RDR 我的回答有用吗?
  • 是的......谢谢!
  • @RDR 你找到解决方案了吗?
  • @NIkhil Gupta 你找到解决办法了吗?

标签: spring-boot spring-cloud spring-cloud-config


【解决方案1】:

根据docs,@RefreshScope 在技术上将在 @Configuration 上工作,前提是任何依赖于这些 bean 的东西在启动刷新时都不能依赖它们被更新,除非它本身在 @RefreshScope 中

所以请您检查一下您的“Environment.java”,您可能忘记在 Environment.java 中指定@RefreshScope。如果它不起作用,请分享您的 Environment.java。

【讨论】:

    【解决方案2】:

    通常,@Configuration 类包含bean,这意味着数据源方法应标记为@Bean。每个 bean 上都需要 @RefreshScope。

    对于数据源,您可能需要@ConfigurationProperties,而不是为每个属性编写代码。 @ConfigurationProperties 自动包含@RefreshScope,所以这里实际上不需要 RefreshScope。

    使用@ConfigurationProperties 几乎不需要任何代码。

    @Configuration
    public class DBConfig
    {
        @Bean
        @ConfigurationProperties("datasource")
        public DataSource ehubDataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            return dataSource;
        }
    }
    

    如果您的环境不是读取属性文件,那么这可能不适合您。

    如果你想让bean名字和方法名字不同,你可以给@Bean提供一个参数。下面的代码创建了与上面相同的 bean。

        @Bean(name = "ehubDataSource")
        @ConfigurationProperties("datasource")
        public DataSource getDataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            return dataSource;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2016-02-06
      • 2010-11-21
      相关资源
      最近更新 更多