Spring父子容器关系引发的小问题 ——用@Value取值时失败

  在SpringMVC项目中使用@Value从配置文件中取值时,发现service层中可以正常取值,但controller层却无法取到期望值。
  最终发现是Spring父容器无法使用子容器的配置引起的。对配置文件的扫描配置到了spring配置文件中,在springMVC配置文件中没有。而对Controller层的扫描只配置到了springMVC配置文件中,因此无法用@Value从配置文件中取值,特此记录。

jdbc.properties配置文件如下:

jdbc.dialog = oracle

controller层从jdbc.properties读值并打印,代码如下:

@Controller
@RequestMapping("/test")
public class testController extends BaseController {

    @Autowired
	private TestService testService;
	
	@Value("${jdbc.dialog}")
	String jdbcDialog;
    
    @RequestMapping(value = "/test", method = RequestMethod.POST)
	@ResponseBody
	public JsonResult test() {
		System.out.println("Controller层从配置文件读值: " + jdbcDialog);
		testService.test();
		return renderSuccess();
	}
}

service层从jdbc.properties读值并打印,代码如下:

@Service
public class TestSericeImpl implements TestService {

    @Value("${jdbc.dialog}")
    String jdbcDialog;

    @Override
    public void test() {
        System.out.println("service层从配置文件读值: " + jdbcDialog);
    }
}

运行结果如下:
运行结果
  可以看到,在Controller层中直接输出了${name}字符串,在Service层能直接取到properties文件中定义的变量值。
  再检查相应的配置,spring配置文件是spring.xml,springMVC配置文件是spring-mvc.xml,在web.xml中相关配置如下:

<!-- spring配置文件 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:spring/spring.xml</param-value>
</context-param>在这里插入代码片

<!-- Spring MVC配置 -->
<servlet>
	<servlet-name>SpringMVC</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<description>SpringMVC</description>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/spring-mvc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>SpringMVC</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

spring.xml中扫描了service目录,并配置了属性文件解析,相关配置如下:

<!-- Service包(自动注入) -->
<context:component-scan base-package="com.shawn.*.service,com.shawn.*.listener" ></context:component-scan>

<!-- 引入属性文件 -->
	<bean id="propertyConfigurer" class="shawn.core.config.DecryptPropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:config/jdbc.properties</value>
				<value>classpath:config/redis.properties</value>
				<value>classpath:config/config.properties</value>
				<value>classpath:config/mongoDb.properties</value>
			</list>
		</property>
		<property name="fileEncoding">
			<value>UTF-8</value>
		</property>
	</bean>

spring-mvc.xml中只扫描了controller目录,也没有扫描属性文件,相关配置如下:

<!-- Controller包(自动注入) -->
<context:component-scan base-package="com.shawn.*.controller" use-default-filters="false">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>      
</context:component-scan>

  可以看到,*.properties的解析在Spring父容器里,而对controller目录的扫描在SpringMVC子容器里。父容器访问不到子容器的东西。配置文件在父容器里,而@Value是由父容器去操作的,他访问不了子容器,所以无法完成注入动作。因此出现了上述现象。
  解决办法也很简单,只要将属性文件解析部分的配置拷到spring-mvc.xml配置文件中即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值