参考博客:https://blog.csdn.net/Thinkingcao/article/details/80620240
问题引入
在项目中需要引入一个properties配置文件,这里的是upload.properties,配置了一个物理硬盘目录。
然后在spring的applicationContext.xml配置文件中加载引入properties文件
然后在一个控制器Controller类中使用
可以看到并没有得到@Value中注入的值
那么问题就来了,为什么在Controller层中无法得到@Value("${basePath}")的值呢?
但是,在Service层中却可以访问该@Value("${basePath}")的值,如下,创建一个Service层,使用@Service注解,然后在该实现类中使用@Value("${basePath}”)注入basePath值,通过一个getPath()方法将值传递出去:
接着在controller层中注入service,调用该方法。
确实可以访问在service层
原因
因为controller注册在spring-mvc.xml代表的spring mvc容器中,而service注册在applicationContext.xml代表的spring的容器中。
如果<context:property-placeholder>引入properties配置文件只注册在spring的容器中,那么只有业务层的类可以访问到@Value("${basePath}”)的值,而控制器Controller层无法访问到值。
因此解决方法就是在spring-mvc.xml和applicationContext.xml文件中都注册<context:property-placeholder>。
下面来做一个有趣的小实验:
①只在spring-mvc.xml中引入<context:property-placeholder>
发现Controller控制层确实可以访问到@Value("${basePath}")的值,但是发现service层无法得到@Value("${basePath}")的值了
②只在applicationContext.xml中引入<context:property-placeholder>
发现service层可以访问到@Value("${basePath}")的值(注意:下面的代码虽然有Controller类的涉入,但实际上只是用来表示service层获取到值的一个媒介,实际上值来自于service层,与controller层无关)
但在controller层却无法得到值。
③既在applicationContext.xml中引入<context:property-placeholder>,又在spring-mvc.xml中引入<context:property-placeholder>
在controller层能访问
在service层也能访问
解决
按如上所说,解决方法有上面这么三种:
第一种:既在applicationContext.xml中引入<context:property-placeholder>,又在spring-mvc.xml中引入<context:property-placeholder>,那么controller层和service层都可以访问到@Value中的值。
第二种:只需要在controller层访问,那么在控制层注入@Value即可。
第三种:在service层注入@Value,但是创建一个接口,里面设置一个方法返回@Value中的值,实现接口中的方法返回值,然后在controller层注入service接口,通过接口的方法也能间接得到@Value的值。