我创建了一个使用一些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" />
任何人都可以请教我这个混乱。
答案 0 :(得分:4)
一些术语:ServletContext
is the class。 Servlet上下文是ApplicationContext
的Spring DispatcherServlet
。 应用程序上下文,也称为根上下文是ApplicationContext
加载的ContextLoaderListener
并存储在Web应用程序的ServletContext
中。因此,它可供其他Web应用程序组件使用。
servlet上下文由DispatcherServlet
加载。 DispatcherServlet
从ServletContext
检索应用程序上下文,并将其用作servlet上下文的父级。
servlet Filter
是与DispatcherServlet
无关的Web应用程序组件,即。它不知道servlet上下文。
DelegatingFilterProxy
州的javadoc
支持web.xml中的“targetBeanName”过滤器init-param,指定 Spring应用程序上下文中目标bean的名称。
因此必须在应用程序上下文中声明Filter
bean,而不是servlet上下文。
将具有应用程序范围的所有bean放在应用程序上下文中。
将与MVC堆栈相关的所有bean放在servlet上下文中。
您的component-scan
应扫描相应的套餐,以支持上述两条规则/建议。
进一步阅读: