springmvc的父子容器中资源的注入问题

在使用@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即可取值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值