@Refreshscope与数据源配置

时间:2017-04-04 20:19:27

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

我在Spring启动应用程序中有一个数据源配置类。

下面的代码段

我的配置是从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;
    }

}

2 个答案:

答案 0 :(得分:1)

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

那么请你检查你的&#34; Environment.java&#34;,你可能忘记在Environment.java中指定@RefreshScope。如果它不起作用,请分享你的Environment.java。

答案 1 :(得分:0)

通常,@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;
    }