使用@PropertySource 访问@Lazy 初始化的@Bean 的public 属性

Accessing public property of a @Lazy initialized @Bean with @PropertySource

Spring 4.3.12

我正在使用 @Configuration classes 来延迟初始化一个 bean

@Configuration
public class Configuration {
    @Bean
    @Lazy
    public Config config(){
        propertySourceInjector().injectToEnvironment();
        return new Config();
    }

    @Bean
    public PropertySourceInjector propertySourceInjector(){
        return new PropertySourceInjector ();
    }
}

配置class:

public class Config{
    @Autowired
    private Environment environment;

    @Value("${customConfigValue}")
    public Integer configValue;

    public Integer getConfigValue() {
        return configValue;
    }
}

PropertySourceInjector class:

public class PropertySourceInjector {
    public void injectToEnvironment(){
         //reads DB and adds a property source to Spring Enviroment's property sources
    }
}

当我访问 Config.getValue() 方法时,注入正确进行。添加了 PropertySource,@Value 将正确的值分配给字段 configValue.

@Autowired @Lazy 
Config config;

System.out.println(Config.getConfigValue());  //works!!

当我访问 Config.value public 字段时,注入从未发生。该 bean 未初始化。

@Autowired @Lazy 
Config config;

System.out.println(Config.configValue)  //Fails. Prints null

为什么?

Config.configValue是直接访问一个字段。 Lazy 代理对直接访问不执行任何操作,因此不会触发 bean 加载。

configValue 设为私有字段并使用 getter.