springMvc中WebApplicationContext的继承关系
最近在做一个功能的时候遇到了个问题,有点不能理解,具体问题是这样的,有一个bean,id为platform,我明明在xml文件里面注册了,并且也已经检查了这个xml在启动的时候已经被扫到了spring容器里。而且在controller等地方都可以注入进来。但是偏偏在manager里注不进来,当然我的项目不是很简单的架子,这个controller和manager是分离的,controller可以正常
最近在做一个功能的时候遇到了个问题,有点不能理解,具体问题是这样的,有一个bean,id为platform,我明明在xml文件里面注册了,并且也已经检查了这个xml在启动的时候已经被扫到了spring容器里。
而且在controller等地方都可以注入进来。
偏偏在manager里注不进来,有点犯嘀咕,难道是放在两个不同的容器里?但是controller可以正常注入manager中的对象啊。
后来看了下web.xml的配置文件,如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:core/applicationContext.xml</param-value>
</context-param>
<listener>
<description>spring</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:core/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这两个配置,研究了下,使用listener注册的applicationContext.xml与使用servlet注册的spring-servlet.xml是父与子的关系。
也就是说applicationContext.xml中的bean可以注入到spring-servlet.xml中,但是反之spring-servlet.xml中的bean无法注入到applicationContext.xml中。
也就是说父亲的东西集成给了儿子,儿子可以用,而儿子的东西父亲不能用,就是这个道理了。
了解了这个之后,回去检查配置文件,就发现controller的扫描配置和id为platform的bean是写在spring-servlet.xml中的,而manager的扫描配置是写在applicationContext.xml中的。
那么如果我想在controller和manager中都使用这个id为platform的bean怎么办呢?
解决方案就是把id为platform的bean配置到applicationContext.xml中,这样父和子都可以使用了。
有人会问为什么不把controller和manager的扫描都写到spring-servlet.xml中,当然可以,但是我的项目不是很简单的架子,这个controller和manager是分离的,所以扫描注解的时候不是写在一起的,只能说需求不一样。
以上只是举了个简单的例子,可能有漏洞,但基本概念肯定是对的。
更多推荐
所有评论(0)