Spring 上下文:applicationContext.xml和dispatcher-servlet.xml中的组件扫描
我创建了一个servlet过滤器,它使用一些自动连接的字段。为了让它工作,我在web.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。为了解决这个问题,我搬家了
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
的SpringApplicationContext
应用程序上下文,也称为根上下文,是由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
的SpringApplicationContext
应用程序上下文,也称为根上下文,是由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别以为我把我的钱放在哪里了部件扫描
。这两个上下文可能都有组件扫描
元素。遵循我在回答中列出的指导原则。如果这意味着将类移动到不同的包中,那么就这样吧。显然,我不能具体告诉你要改变什么,你还没有向我们展示你的背景。只需注意,组件扫描
递归地遍历包。