在使用@value来获取properties文件里面的值时发现里面的值并没有被注入:
@Value(value = "${REPOSITORY_PATH}")
private String REPOSITORY_PATH;
@Value(value = "${MAGE_BASE_URL}")
private String MAGE_BASE_URL;
但是spring容器中已经加载了配置文件了,代码如下:
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 允许JVM参数覆盖 -->
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<!-- 忽略没有找到的资源文件 -->
<property name="ignoreResourceNotFound" value="true" />
<!-- 配置资源文件 -->
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:env.properties</value>
</list>
</property>
</bean
使用debug启动时发现确实没有注入这个值,原因如下:
@Value作用:获取配置文件的值。
注入值:在Spring容器初始化所有的bean之后,在当前的所在容器中获取值,然后注入。
其实在使用了spring+springmvc后项目启动时,加载了两个容器,一个是父容器,一个是子容器:
Spring容器 – 父容器
SpringMVC容器 – 子容器
父子容器的关系:
1、 子容器能够访问父容器的资源(bean)
a) 示例:Controller可以注入Service
2、 父容器不能访问子容器的资源(bean)
其实我们的controller是springmvc子容器中的bean而 我们的properties文件是在spring中加载的,又由于@value注解的机制:在Spring容器初始化所有的bean之后,在当前的所在容器中获取值,然后注入!子容器中都没有加载properties文件当然无法注入了!
修改:
<context:property-placeholder location="classpath:env.properties"/>
在springmvc配置文件中加载这个配置文件的内容,就可以把内容正确的注入。
那么问题又来了,我要是想在service中使用这个值呢?我是不是还得在spring父容器中再加载一遍呢?
为了解决这个问题,可以这样来:
1.创建一个PropertiesServie类,专门加载一些必须的properties内容。
2.把properties文件再父容器中加载
3.在PropertiesServiece中使用@value注入属性值
4.即可全局使用
@Service
public abstract class PropertiesService{
//拿到env.properties里面的变量
@Value(value = "${REPOSITORY_PATH}")
public String REPOSITORY_PATH;
@Value(value = "${MAGE_BASE_URL}")
public String MAGE_BASE_URL;
}
使用:
@Autowired
private PropertiesService propertiesService;
propertiesService. REPOSITORY_PATH即可取值。