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

时间:2017-12-15 15:23:17

标签: java spring lazy-loading

春季4.3.12

我正在使用@Configuration类来延迟初始化bean

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

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

配置类:

public class Config{
    @Autowired
    private Environment environment;

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

    public Integer getConfigValue() {
        return configValue;
    }
}

PropertySourceInjector类:

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公共字段时,注入永远不会发生。 bean未初始化。

@Autowired @Lazy 
Config config;

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

为什么?

1 个答案:

答案 0 :(得分:3)

Config.configValue是对某个字段的直接访问。 Lazy代理对直接访问没有任何作用,因此没有任何东西可以触发bean加载。

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

相关问题