spring 为什么使用new创建的Bean也会注入字段?

umuewwlo  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(142)

下面是一些代码,我很好奇它是如何工作的:这是一个@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上下文如何知道接受一个对象,将其与一个“构造型”匹配,并进行字段注入,而不是让对象不被注入?

eyh26e7m

eyh26e7m1#

ConfigClientProperties bean的属性是由Sping Boot 填充的,因为该类是用@ConfigurationProperties注解的。
Sping Boot 使用Spring Framework BeanPostProcessor实现此功能。在将所有Bean添加到应用程序上下文(例如,从ConfigClientAutoConfiguration中的@Bean方法)后,Spring Boot中的BeanPostProcessor将检查Bean,以查看它们是否使用@ConfigurationProperties进行了注解,并从环境中填充任何此类已注解Bean的属性。

相关问题