下面是一些代码,我很好奇它是如何工作的:这是一个@Bean
方法,它返回一个用new
示例化的对象。但同时,它设法注入字段,因为有一个类的“构造型”,注解为@ConfigurationProperties
:
生成方为ConfigClientAutoConfiguration.java:
该方法
@Bean
@ConditionalOnMissingBean
public ConfigClientProperties configClientProperties(Environment environment, ApplicationContext context) {
if (context.getParent() != null && BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context.getParent(),
ConfigClientProperties.class).length > 0) {
return BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(), ConfigClientProperties.class);
}
// this looks like a standard constructor call
// why would Spring "know" to inject fields
ConfigClientProperties client = new ConfigClientProperties(environment);
return client;
}
在应用程序中,我们被告知使用new
创建的对象总是绕过场注入。
这是ConfigClientProperties.java类的“构造型”--由于创建对象的方式,我认为它会绕过字段注入,但在运行时,字段都是从属性中正确填充的。
在这段代码(spring-cloud-config-client)中,这是一个封装对象,用于封装进行HTTP调用所需的一组spring.cloud.config*
属性。
Spring工厂中的TL;DR上下文如何知道接受一个对象,将其与一个“构造型”匹配,并进行字段注入,而不是让对象不被注入?
1条答案
按热度按时间eyh26e7m1#
ConfigClientProperties
bean的属性是由Sping Boot 填充的,因为该类是用@ConfigurationProperties
注解的。Sping Boot 使用Spring Framework
BeanPostProcessor
实现此功能。在将所有Bean添加到应用程序上下文(例如,从ConfigClientAutoConfiguration
中的@Bean
方法)后,Spring Boot中的BeanPostProcessor
将检查Bean,以查看它们是否使用@ConfigurationProperties
进行了注解,并从环境中填充任何此类已注解Bean的属性。