我遇到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 :-)
}
}
答案 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应用程序上下文来定义硬编码属性