context:applicationContext.xml和dispatcher-servlet.xml中的component-scan

时间:2014-03-08 18:53:55

标签: spring spring-mvc

我创建了一个使用一些Autowired字段的servlet过滤器。为了使其工作,我在web.xml中将其声明为DelegatingFilterProxy。在此过滤器之前,我的enitre spring配置在dispatcher-servlet.xml中,但由于某种原因,声明此过滤器的bean在dispacher-servlet中不起作用。所以,我在applicationContext.xml宣布了它。它开始工作,但过滤器内的Autwired字段然后抛出null。为了解决这个问题,我感动了

<context:component-scan base-package="com.myproj.abc" />

到applicationContext,过滤器开始工作,但我的控制器类定义的url路径不再映射。所以我需要在applicationContext

中拉出以下两行
<mvc:default-servlet-handler />    
<mvc:annotation-driven />

这解决了这个问题。但我想知道这是所有这些代码的正确位置吗?因为Spring安全性以及静态资源和视图映射所有这些代码都在调度程序中。在我的另一个项目中,我遇到了同样的问题,在那里我做了这样的事情,只在applicationContext

中声明了一行
<context:component-scan base-package="com.myproj.abc" />

在dispatcher-servlet中,我只将组件扫描包更改为控制器,并仅将所有其他代码保存在那里(在调度程序中)

 <context:component-scan base-package="com.myproj.abc.controller" />

任何人都可以请教我这个混乱。

1 个答案:

答案 0 :(得分:4)

一些术语:ServletContext is the class Servlet上下文ApplicationContext的Spring DispatcherServlet应用程序上下文,也称为根上下文ApplicationContext加载的ContextLoaderListener并存储在Web应用程序的ServletContext中。因此,它可供其他Web应用程序组件使用。

servlet上下文由DispatcherServlet加载。 DispatcherServletServletContext检索应用程序上下文,并将其用作servlet上下文的父级。

servlet Filter是与DispatcherServlet无关的Web应用程序组件,即。它不知道servlet上下文。

DelegatingFilterProxy州的javadoc

  

支持web.xml中的“targetBeanName”过滤器init-param,指定   Spring应用程序上下文中目标bean的名称。

因此必须在应用程序上下文中声明Filter bean,而不是servlet上下文。

将具有应用程序范围的所有bean放在应用程序上下文中。

将与MVC堆栈相关的所有bean放在servlet上下文中。

您的component-scan应扫描相应的套餐,以支持上述两条规则/建议。

进一步阅读: