我在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;
}
}
答案 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;
}