您可以在Spring Boot 2 @ConfigurationProperties中使用作用域代理吗?

时间:2018-07-24 18:53:34

标签: java spring spring-boot spring-aop

使用Spring Boot 1.5.12,我们为@ConfigurationProperties bean创建了作用域代理。我们这样做是为了我们可以有效地拥有范围为用户/会话/等的属性值。我们使用BeanFactoryPostProcessor注册由ScopedProxyUtils.createScopedProxy创建的作用域代理,并将目标bean定义的范围更改为我们的自定义范围。

这在Spring Boot 1.5.12中非常有效。但是,在Spring Boot 2中,the introduction of the Binder API使其停止工作。这是因为当Spring Boot在其ConfigurationPropertiesBindingPostProcessor中绑定@ConfigurationProperties时,它使用Bindable.of(type).withExistingValue(bean)传入type(例如org.example.Foo)和bean这是ScopedProxyFactoryBean的实例。 Bindable checks that bean is an instance of type并非如此,事情开始爆发。

有人知道实现此目标的一般方法吗?具体来说,要用代理替换@ConfigurationProperties bean定义,同时仍然允许属性绑定到实例?我考虑过将代理的创建推迟到ConfigurationPropertiesBindingPostProcessor绑定目标之后(即在我自己的BeanPostProcessor中)。但是,这时实例化了bean,而我的代理只能替换bean。它实际上不能将原始bean留在上下文中作为目标。因此,我在努力使用BeanPostProcessor来做到这一点。

编辑:我创建了a simple example project来演示此问题(具有检出在Spring Boot 1上有效但在Spring Boot 2上失败的代码的功能)。

0 个答案:

没有答案