我希望在运行时在Spring配置服务器中添加一些属性,并且这些属性应该通过
我不会预定义此属性,因为我将在Spring配置服务器中计算该值并添加到环境变量中。
您能否帮助我了解最佳实现方法?
@Value
注释对所有客户端应用程序可用。我不会预定义此属性,因为我将在Spring配置服务器中计算该值并添加到环境变量中。
您能否帮助我了解最佳实现方法?
@Value
注释对所有客户端应用程序可用。Spring Cloud Configuration有一个名为'RefreshScope'的特性,可以刷新正在运行的应用程序的属性和bean。
如果您了解Spring Cloud Config,它似乎只能从git存储库加载属性,但这并不是真的。
您可以使用RefreshScope从本地文件重新加载属性,而无需连接到外部git存储库或进行HTTP请求。
创建一个名为bootstrap.properties
的文件,并写入以下内容:
# false: spring cloud config will not try to connect to a git repository
spring.cloud.config.enabled=false
# let the location point to the file with the reloadable properties
reloadable-properties.location=file:/config/defaults/reloadable.properties
reloadable.properties
的文件。您可以将其留空或添加一些属性。在此文件中,稍后可以在运行时更改或添加属性。 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
所有使用可能在运行时更改的属性的bean都应该像这样用 @RefreshScope
进行注释:
@Bean
@RefreshScope
Controller controller() {
return new Controller();
}
public class ReloadablePropertySourceLocator implements PropertySourceLocator
{
private final String location;
public ReloadablePropertySourceLocator(
@Value("${reloadable-properties.location}") String location) {
this.location = location;
}
/**
* must create a new instance of the property source on every call
*/
@Override
public PropertySource<?> locate(Environment environment) {
try {
return new ResourcePropertySource(location);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
将 Spring 配置成使用该类引导配置。
在您的资源文件夹中创建(或扩展)META-INF/spring.factories
文件:
org.springframework.cloud.bootstrap.BootstrapConfiguration=your.package.ReloadablePropertySourceLocator
reloadable.properties
中读取属性。当刷新应用程序时,Spring Cloud Config将从磁盘重新加载它。reloadable.properties
,然后刷新spring上下文。您可以通过向/refresh
端点发送POST请求或使用ContextRefresher
在Java中刷新。@Autowired
ContextRefresher contextRefresher;
...
contextRefresher.refresh();
如果您选择与来自远程git仓库的属性并行使用,这也应该可以工作。