大家晚上好。我有一个用于绑定属性的类。在标记为@Configuration
的类中,我将这个bean对象做成:
// Into TargetConfiguration class
@Bean("someBeanName")
@ConfigurationProperties("some.path")
public beanProperties() {
return new BeanProperties();
}
我想测试此配置的所有功能,为此,我创建了一个测试类,如:
@WebFluxTest
@TestPropertySource("classpath:test.properties")
@ContextConfiguration(classes = {TargetConfiguration.class})
class Test {...}
问题是BeanProperties
将包含空字段,但是如果我进行其他操作OtherBeanProperties
并通过@EnableConfigurationProperties
在TargetConfiguration
中进行注册,则通常会填充,但对于BeanProperties
,我无法执行此操作,因为此bean取决于 test.properties 中的属性。另外,如果我通过@TestConfiguration
配置创建了这个bean,那么它将被填充到...
感谢您的帮助。
UPD-1:第一个假设-我注册了一个类,该类扩展了BeanDefinitionRegistryPostProcessor
并带有名为@DependsOn
的{{1}}注释。我不知道为什么,但是如果我在RegistratorClass
类上添加@DependsOn
,我的RegistratorClass
会立即构建而没有绑定(并传递给其他想要接收此BeanProperties
的方法)。如果我删除此注释,BeanProperties
将初始化第一个注释,而我的RegistratorClass
将被正常构造并绑定到属性。
答案 0 :(得分:1)
BeanDefinitionRegistryPostProcessor
在生命周期的早期进行了初始化,旨在用于添加其他bean定义。在您发布到https://github.com/spring-projects/spring-boot/issues/21584的示例代码中,您声明beanGenerator
取决于someOtherBeanUser
。反过来,someOtherBeanUser
注入beanUser
。这意味着someOtherBeanUser
和beanUser
很早就被注入了。
配置绑定的工作方式是通过ConfigurationPropertiesBindingPostProcessor
。通过触发早期初始化,您迫使Spring在注册beanUser
之前创建ConfigurationPropertiesBindingPostProcessor
。这意味着无法应用绑定。
完整的示例应用程序将帮助确定为什么不绑定属性,但是我相信将@EnableConfigurationProperties
添加到TargetConfiguration
或测试类本身会解决该问题。