使用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上失败的代码的功能)。