带有数据源配置的@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;
}
我在 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;
}