@Refreshscope 与数据源配置

Posted

技术标签:

【中文标题】@Refreshscope 与数据源配置【英文标题】:@Refreshscope with Datasource configuration 【发布时间】: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 你找到解决办法了吗? 【参考方案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;
    

【讨论】:

以上是关于@Refreshscope 与数据源配置的主要内容,如果未能解决你的问题,请参考以下文章

解决 @RefreshScope 导致定时任务注解 @Scheduled 失效

解决 @RefreshScope 导致定时任务注解 @Scheduled 失效

@RefreshScope 加在 Quartz 触发器类导致异常问题分析

配置类中的@RefreshScope

SpringBoot+Nacos:@RefreshScope自动刷新原理

配置中心@ConfigurationProperties+@RefreshScope 动态配置