Spring属性热重装

时间:2019-02-07 21:23:52

标签: java spring spring-boot aspectj

在一个项目中,我有一个org.apache.commons.configuration.PropertiesConfiguration对象注册为Bean,以提供具有热重载功能的应用程序周围的配置值。

示例:我定义了一个DataSource单例Bean。然后,我创建了一个ReloadingDataSource对象,该对象包装并委托给“真实的” DataSource,并且每次配置文件更改时,它都可以以线程安全的方式重新创建它。

我想对简单属性值做类似的事情。
我想创建一个简单的Autowire对象,将检索委托给Apache PropertiesConfiguration Bean。

用法应类似于:

@Property("my.config.database")
private Property<String> database;

呼叫站点将简单地是:

final String databaseValue = database.get()

您会说,只需绕过PropertiesConfiguration对象。也许您是对的,但是我想在此基础上提供另一个抽象,一个更易于使用的抽象。

我知道使用ProxyFactoryBean可以为方法调用创建AOP代理。这是正确的道路,还是有更好的选择?也许是纯Spring AOP / AspectJ?

我不想使用Spring Cloud或类似的依赖项。

1 个答案:

答案 0 :(得分:0)

Spring Cloud将重新创建Bean,因此请记住您想出什么解决方案,如果您有另一个Bean,例如在启动时仅读取该值一次,则它不会重新初始化自身,即Spring Cloud Config解决的问题。

据我所知,AOP仅在方法级别起作用,因此您可以肯定地拦截对somebean.getFoo()的调用。但是在somebean中,无法代理对变量本身的调用:somebean.foo。每次foo更改时,您都必须重置PropertiesConfiguration,并再次记住,如果其他任何事情需要新的foo值,则需要处理此问题或让子弹着急。使用Spring Cloud。

在运行时为避免重新部署而更改内容所产生的开销应该认真考虑。对于Netflix来说,这很有意义,因为它们有成千上万的服务器。但是对于较小的玩家,我看不出理由,这一决定增加了很多复杂性。要测试的噩梦。

  • 您是否在运行时测试了更改配置还是接受了风险并认为它可行?
  • 您是否在用户执行数据库事务的负载下测试从A-> B的更改?
  • 测试foo发生变化的其他加注条件吗?

有些事情要考虑。