在解析@Value变量之前调用Spring @Bean工厂方法

时间:2016-03-11 11:29:30

标签: spring configuration javabeans

我遇到Spring Java / XML配置的订单解决问题。似乎在调用@Value工厂方法之前未解析@Bean注释,特别是在从外部XML配置加载属性时。

这是我正在做的精简版:

@Configuration
@ImportResource({"classpath:configurable-context.xml"})
public class SecurityConfig {

    @Value("#{myProps['my.custom.key']}")
    private String someValue = null;

    @Bean
    public SomeObject someObject() {
        return new SomeObject(someValue);   // Fails because someValue == null
    }
}

这是configurable-context.xml:

...
<util:map id="myProps">
    <entry key="my.custom.key" value="myVal"/>
</util:map>
...

问题是someObject(...)工厂方法是在为@Value评估的someValue注释之前调用的,因此当时为null

关于如何在调用工厂方法之前强制解析someValue变量的任何想法?

更新 受到@Ekem响应的启发,这段代码使用了XML源代码属性:

@Configuration
@ImportResource({"classpath:configurable-context.xml"})
public class SecurityConfig {

    @Resource(name = "myProps")
    private Properties myProps;

    @Bean
    public SomeObject someObject() {
        return new SomeObject(myProps.getProperty("my.custom.key"));    // Now works :-)
    }
}

1 个答案:

答案 0 :(得分:0)

按如下所示更改配置,以便首先初始化myProps bean

@Configuration @ImportResource({ “类路径:配置-context.xml中”})

public class SecurityConfig {

    @Value("#{myProps['my.custom.key']}")
    private String someValue = null;

    @Bean
    @DependOn("myProps")
    public SomeObject someObject() {
        return new SomeObject(someValue);  
    }
}

或者使您的配置干净地使用环境抽象,如下所示

@Configuration
@PropertySource("classpath:application.properties")
    public class SecurityConfig {

            @Autowired
            private private Environment env;

            @Bean
            public SomeObject someObject() {
                return new SomeObject(env.getProperty("my.custom.key"));  
            }
        }

然后使用条目my.custom.key = myVal将application.properties文件添加到类路径的根目录中 这将不再需要xml应用程序上下文来定义硬编码属性