带有数据源配置的@Refreshscope

@Refreshscope with Datasource configuration

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

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

}

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

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

通常,@Configuration class 包含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;
    }