Spring 上下文:applicationContext.xml和dispatcher-servlet.xml中的组件扫描

Spring 上下文:applicationContext.xml和dispatcher-servlet.xml中的组件扫描,spring,spring-mvc,Spring,Spring Mvc,我创建了一个servlet过滤器,它使用一些自动连接的字段。为了让它工作,我在web.xml中将它声明为DelegatingFilterProxy。在这个过滤器之前,我的enitre-spring配置在dispatcher-servlet.xml中,但由于某种原因,为这个过滤器声明bean在dispatcher-servlet中不起作用。因此,我在applicationContext.xml中声明了它。它当时开始工作,但过滤器中的Autwired字段随后抛出了null。为了解决这个问题,我搬家了

我创建了一个servlet过滤器,它使用一些自动连接的字段。为了让它工作,我在web.xml中将它声明为
DelegatingFilterProxy
。在这个过滤器之前,我的enitre-spring配置在
dispatcher-servlet.xml
中,但由于某种原因,为这个过滤器声明bean在dispatcher-servlet中不起作用。因此,我在
applicationContext.xml
中声明了它。它当时开始工作,但过滤器中的Autwired字段随后抛出了
null
。为了解决这个问题,我搬家了

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

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

<mvc:default-servlet-handler />    
<mvc:annotation-driven />
<context:component-scan base-package="com.myproj.abc" />

这就解决了问题。但我想知道这是不是所有这些代码的正确位置?因为Spring安全性以及静态资源和视图映射,所有这些代码都在dispatcher中。在我的另一个项目中,我遇到了同样的问题,我也这样做了,在applicationContext中只声明了以下几行

<mvc:default-servlet-handler />    
<mvc:annotation-driven />
<context:component-scan base-package="com.myproj.abc" />

在DispatcherServlet中,我将组件扫描包更改为仅限控制器,并将所有其他代码仅保留在那里(在dispatcher中)


有谁能告诉我这个困惑。

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

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

servlet
过滤器
是与
DispatcherServlet
无关的web应用程序组件,即它不知道servlet上下文

各州的javadoc

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

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

将所有具有应用程序作用域的bean放在应用程序上下文中

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

您的
组件扫描
应扫描适当的软件包,以支持上述两个规则/建议

进一步阅读:

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

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

servlet
过滤器
是与
DispatcherServlet
无关的web应用程序组件,即它不知道servlet上下文

各州的javadoc

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

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

将所有具有应用程序作用域的bean放在应用程序上下文中

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

您的
组件扫描
应扫描适当的软件包,以支持上述两个规则/建议

进一步阅读:


谢谢,这消除了我的一些疑虑。但是我应该把
组件扫描
放在哪里呢?因为正如我提到的,如果我在
应用程序上下文
中执行
组件扫描
,那么它就不会映射我的控制器URL,如果我把它放在dispatcher中,那么我的
过滤器
就会被剥夺autowiring@Abhi别以为我把我的钱放在哪里了
部件扫描
。这两个上下文可能都有
组件扫描
元素。遵循我在回答中列出的指导原则。如果这意味着将类移动到不同的包中,那么就这样吧。显然,我不能具体告诉你要改变什么,你还没有向我们展示你的背景。只需注意,
组件扫描
递归地遍历包。谢谢,它消除了我的一些疑虑。但是我应该把
组件扫描
放在哪里呢?因为正如我提到的,如果我在
应用程序上下文
中执行
组件扫描
,那么它就不会映射我的控制器URL,如果我把它放在dispatcher中,那么我的
过滤器
就会被剥夺autowiring@Abhi别以为我把我的钱放在哪里了
部件扫描
。这两个上下文可能都有
组件扫描
元素。遵循我在回答中列出的指导原则。如果这意味着将类移动到不同的包中,那么就这样吧。显然,我不能具体告诉你要改变什么,你还没有向我们展示你的背景。只需注意,
组件扫描
递归地遍历包。