@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 触发器类导致异常问题分析