最近在做一个功能的时候遇到了个问题,有点不能理解,具体问题是这样的,有一个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是分离的,所以扫描注解的时候不是写在一起的,只能说需求不一样。

以上只是举了个简单的例子,可能有漏洞,但基本概念肯定是对的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐