Spring中 @Value取不到值的解决方案

问题描述:

       在一个SpringMVC的项目中,@Value注解在Controller层生效,但是在 Service层就无法注入成功。

问题分析:

1、首先看 web.xml 中Spring配置



    springmvc
    org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        /WEB-INF/spring-servlet.xml
    
    
    1



    springmvc
    *.do




 
 
   org.springframework.web.context.ContextLoaderListener 
 
 
 
   contextConfigLocation 
   classpath:config/applicationContext.xml 


DispatchServlet 引入了 SpringMVC 所需配置 spring-servlet.xml。

ContextLoaderListener 引入了 Spring 所需配置 applicationContext.xml 。

以下是可以配置在 spring-servlet.xml、applicationContext.xml中的 @Value所需加载配置文件的配置


		
			
				classpath:conf/setting.properties
			
		
	

这段代码的配置就可以 利用 @Value 注解获取 setting.properties中的信息了。

但是请注意 spring-servlet.xml 如果配置以上代码,而 applicationContext.xml 没有配置,则 Service层 @Value注解将失效;如果applicationContext.xml 如果配置以上代码,而 spring-servlet.xml 没有配置,则 Controller 层、Service层 的 @Value都生效。

为什么会这样呢?

官方文档有这样的描述:

Spring lets you define multiple contexts in a parent-child hierarchy. 
spring允许你定义多个上下文在父子继承关系中

The applicationContext.xml defines the beans for the “root webapp context”, i.e. the context associated with the webapp. 
applicationContext.xml文件是为了”根webapp应用上下文”定义bean, 也就是说它的上下文是和webapp想关联的

The spring-servlet.xml (or whatever else you call it) defines the beans for one servlet’s app context. There can be many of these in a webapp, 
spring-servlet.xml文件(或是其他的你习惯的称呼)是为了一个servlet应用上下文呢定义bean. 在一个webapp中可以有多个此配置文件,

one per Spring servlet (e.g. spring1-servlet.xml for servlet spring1, spring2-servlet.xml for servlet spring2). 
每一个spring的servlelt(例如: 名为spring1的servlet拥有配置文件spring1-servlet.xml, 名为spring2的servlet拥有配置文件spring2-servlet.xml).

Beans in spring-servlet.xml can reference beans in applicationContext.xml, but not vice versa. 
在spring-servlet.xml中定义的bean可以直接引用在applicationContext.xml中定义的bean, 但是反过来不可以.

All Spring MVC controllers must go in the spring-servlet.xml context. 
所有springmvc的Controller必须在spring-servlet.xml对应的上下文中运行.

In most simple cases, the applicationContext.xml context is unnecessary. It is generally used to contain beans that are shared between all servlets 
在大多数简单的情况下, applicationContext.xml对应的上下文并不必须. 它通常用来包含那些bean用来在webapp中所有servlet之间共享.

in a webapp. If you only have one servlet, then there’s not really much point, unless you have a specific use for it. 
如果你只有一个servlet, 那么实际没有什么必要定义applicationContext.xml, 除非你有特别应用.

你可能感兴趣的:(Spring,SpringMVC)