【问题标题】:context:component-scan in both applicationContext.xml and dispatcher-servlet.xmlapplicationContext.xml 和 dispatcher-servlet.xml 中的 context:component-scan
【发布时间】:2014-04-11 23:43:13
【问题描述】:

我创建了一个使用一些 Autowired 字段的 servlet 过滤器。为了使它工作,我在 web.xml 中将其声明为 DelegatingFilterProxy 。在这个过滤器之前,我的整个弹簧配置在dispatcher-servlet.xml,但由于某种原因,为这个过滤器声明 bean 在调度程序 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 中,我将组件扫描包更改为仅控制器,并将所有其他代码保留在那里(在 dispatcher 中)

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

谁能告诉我这个困惑。

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

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

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

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

    DelegatingFilterProxy 状态的 javadoc

    支持 web.xml 中的“targetBeanName”过滤器初始化参数,指定 Spring 应用程序上下文中目标 bean 的名称。

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

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

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

    您的component-scan 应该扫描相应的包以支持上述两个规则/建议。

    进一步阅读:

    【讨论】:

    • 感谢它消除了我的一些疑虑。但是我到底应该把component-scan放在哪里,因为正如我提到的,如果我在applicationContext中输出component-scan,那么它不会映射我的控制器网址,如果我把它放在调度程序中,那么我的Filter将被剥夺自动装配跨度>
    • @Abhi 不要认为它是我将component-scan放在哪里。两个上下文都可能有 component-scan 元素。请遵循我在回答中提出的指导方针。如果这意味着将你的类移动到不同的包中,那就这样吧。显然,我不能具体告诉你要改变什么,你没有向我们展示你的背景。请注意 component-scan 递归地遍历包。
    猜你喜欢
    • 2017-02-04
    • 2014-04-27
    • 2011-10-04
    • 2011-03-30
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多