场景:
两个配置文件:,,在数据库配置里面引用
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/</value>
<value>file:/etc/</value>
</list>
</property>
</bean>
这时候,里面的属性就不会被加载进去了,如果你使用@Value,就会报Could not resolve placeholder。
@Controller
public class FirstController {
@Value("${}")
private String test;
@RequestMapping("/getw")
public String welcome(Map<String, Object> model) {
//("message", );
System.out.println(test);
return "my";
}
}
这样使用就会报Could not resolve placeholder。
解决:把的内容放到,然后这边引用:
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/</value>
<value>file:/etc/</value>
</list>
</property>
</bean>
或者两个文件都加载:
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/</value>
<value>classpath*:/</value>
<value>file:/etc/</value>
</list>
</property>
</bean>
原因是spring的加载机制:Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了),所以根据加载的顺序,配置的第二个property-placeholder就被没有被spring加载,所以在使用@Value注入的时候占位符就解析不了。
转自:/tiramisuyj/p/