在一个项目中,我有一个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或类似的依赖项。
答案 0 :(得分:0)
Spring Cloud将重新创建Bean,因此请记住您想出什么解决方案,如果您有另一个Bean,例如在启动时仅读取该值一次,则它不会重新初始化自身,即Spring Cloud Config解决的问题。
据我所知,AOP仅在方法级别起作用,因此您可以肯定地拦截对somebean.getFoo()
的调用。但是在somebean
中,无法代理对变量本身的调用:somebean.foo
。每次foo
更改时,您都必须重置PropertiesConfiguration
,并再次记住,如果其他任何事情需要新的foo
值,则需要处理此问题或让子弹着急。使用Spring Cloud。
在运行时为避免重新部署而更改内容所产生的开销应该认真考虑。对于Netflix来说,这很有意义,因为它们有成千上万的服务器。但是对于较小的玩家,我看不出理由,这一决定增加了很多复杂性。要测试的噩梦。
foo
发生变化的其他加注条件吗?有些事情要考虑。