Spring无法看到servlet-context和contextConfigLocation之间的bean。

13 浏览
0 Comments

Spring无法看到servlet-context和contextConfigLocation之间的bean。

我有一个按如下设置的Spring MVC项目:


    appServlet
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      /WEB-INF/spring-contexts/servlet-context.xml
    
    1


      contextConfigLocation
      /WEB-INF/spring-contexts/configuration-context.xml

如果我在configuration-context.xml中创建一个bean并引用servlet-context.xml中的一个bean,它无法找到。这两个上下文是分开创建的吗?为什么会发生这种情况/通常如何工作?

0
0 Comments

问题的原因是在Spring中存在两个上下文(父上下文和子上下文)。DispatcherServlet的bean可以访问ContextLoaderListener的bean,但反过来则不行。因此,将基本的内容放在configuration-context.xml中,将与Web相关的内容放在servlet-context.xml中。

解决方法就是将txManager定义在servlet-context.xml中,而不是在applicationContext中。这样,Web servlet就可以访问到txManager了。

参考链接:ContextLoaderListener or not? (https://stackoverflow.com/questions/9016122)

0
0 Comments

Spring在上下文和contextConfigLocation beans之间看不到bean的问题出现的原因是:在根上下文和servlet上下文之间初始化顺序的不同。在根上下文配置类/ XML中,如果尝试获取在servlet上下文中定义的bean,则会得到NULL(因为servlet上下文尚未初始化,因此可以说在根上下文初始化时bean不可见)。但是在初始化servlet上下文后(可以通过应用程序上下文获取bean),可以获取在servlet上下文中定义的bean。

解决方法是:在根配置类/ XML中添加"org.springframework.web.servlet"基础包,以便在过滤器或另一个servlet上下文中访问servlet上下文的bean。另外,如果要在根上下文中获取自定义bean,请将基础包值添加到根上下文组件扫描中。对于在过滤器中获取应用程序上下文,可以使用WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext())方法。

希望这可以清楚地说明如何在上下文之间访问bean。

0