`

DispatcherServlet 和 ContextLoaderListener 的关系,到底用哪个?

 
阅读更多
from: http://www.cnblogs.com/caryfang/p/5675178.html

我们先看下这两个东东的配置方法:




对于contextConfigLocation参数,有2个地方可以配置:
1)context-param 是全局性配置
2)servlet下的init-param 是局部性配置
若以上两处都设置了一个相同的bean配置文件路径,那么该文件内配置的bean会被初始化2次,所以一个配置文件只能选择一种配置位置;

项目中使用spring框架有2种方式:
1)listener下的ContextLoaderListener 是一种引入方式,默认读取/WEB-INF/applicationContext.xml
2)若是spring-web项目,DispatcherServlet 也是一种引入方式,默认读取/WEB-INF/${servlet-name}-servlet.xml
倘若以上2种配置都引入了,那么全局性的bean配置文件会被加载2次;而且2种方式的各自配置文件里的配置项在某种意义上并不是合并互补,而是各成一个体系(虽然普通的bean看似是都加载到全局上下文来了,但还是有一些特殊bean和配置项没有按预期的那样工作);
比如/WEB-INF/applicationContext.xml文件下里的AOP声明式配置:
<!--aop 行为-->
<bean id="himvn" class="com.tangbao.hellomvn.Himvn" />
<!--aop 注释方式-->
<bean id="hiaspect" class="com.tangbao.hellomvn.Hiaspect" />
<!--aop config-->
<aop:aspectj-autoproxy />
<aop:config>
    <aop:aspect id="aoplianxi" ref="himvn">
        <aop:pointcut id="test1" expression="execution(* com.tangbao.controller.RestlessController.RestlessController(..))"></aop:pointcut>
        <aop:before method="sayHi" pointcut-ref="test1"></aop:before>
        <aop:after method="sayHi" pointcut-ref="test1"></aop:after>
    </aop:aspect>
</aop:config>
若只是在全局配置项中,而没有在DispatcherServlet 中加载,那么此aop会无效。




所以,在web项目中,就不要使用ContextLoaderListener 和全局配置contextConfigLocation参数了,统一在DispatcherServlet 下配置,应该就不那么混乱了。如下:

这样结果就如我们的预期:多bean配置文件不会出现重复加载,所有aop配置也都生效。



以上论点是在spring4.3.1下亲测所得,当然是从表现猜测本质的,还没有真正去研读Spring的源码,所以若有原理说错之处,还望各位看官指出!
  • 大小: 34.6 KB
  • 大小: 79.2 KB
  • 大小: 75.3 KB
分享到:
评论

相关推荐

    DispatcherServlet 和 ContextLoaderListener 区别

    4. 结构关系:DispatcherServlet可以访问由ContextLoaderListener创建的全局ApplicationContext,同时还可以拥有自己的局部(servlet)ApplicationContext,以实现更高的隔离性和灵活性。 在实际开发中,两者协同...

    web.xml中ContextLoaderListener的运行过程解析

    `web.xml`文件主要用来定义Servlet、过滤器、监听器等组件,以及它们的映射关系和初始化参数。它是Servlet容器(如Tomcat)启动时会读取的配置文件,用于指导容器如何加载和管理Web应用。 ### 2. `...

    配置DispatcherServlet的方法介绍

    要想在程序中使用DispatcherServlet,我们需要在web.xml中配置一个DispatcherServlet。配置的方法是,在web.xml文件中,配置一个 `&lt;servlet&gt;` 节点,它的子节点 `&lt;servlet-name&gt;` 可以自定义一个名字,例如sample, ...

    springmvc例子

    - **web.xml**:Web应用的部署描述符,配置了DispatcherServlet和ContextLoaderListener。 - **servlet-context.xml**:Spring MVC的配置文件,定义了视图解析器、拦截器、数据源、Bean等。 - **Controller类**:...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发

    3. 配置DispatcherServlet和ContextLoaderListener:在web.xml中,使用注解驱动的Spring配置需要配置Spring的DispatcherServlet和ContextLoaderListener。 4. 配置Struts2和Spring的整合:使用Struts2的Spring插件,...

    关于Mybatis与Spring、SpringMVC整合的简单web工程

    在web.xml中,我们需要配置Spring的DispatcherServlet和ContextLoaderListener。前者负责SpringMVC的请求分发,后者初始化Spring的ApplicationContext。同时,我们还需要配置过滤器,如CharacterEncodingFilter,以...

    spring mvc 在 intellij 的 helloworld 基本配置

    - 配置web.xml:在web.xml中需要配置ContextLoaderListener和DispatcherServlet。ContextLoaderListener负责加载Spring配置文件,初始化Spring容器;DispatcherServlet负责请求分发。 - 配置DispatcherServlet:...

    springmvc+spring+hibernate整合(注解)

    6. 配置web.xml,设置DispatcherServlet和ContextLoaderListener,加载Spring的配置文件。 7. 编写测试用例,可以是JUnit测试,也可以通过浏览器发送HTTP请求,验证添加、查询等功能是否正常工作。 整合这三个框架...

    SpringMVC DispatcherServlet组件实现解析

    在 web.xml 文件中,我们可以使用 ContextLoaderListener 来初始化 Root WebApplicationContext,然后使用 DispatcherServlet 来初始化 Servlet WebApplicationContext。代码示例: ```xml &lt;listener-class&gt;org....

    maven+springmvc+mybatis+log4j框架搭建

    3. **配置SpringMVC**:在`web.xml`中配置DispatcherServlet和ContextLoaderListener,然后在Spring的配置文件中声明bean,包括Controller、Service、DAO等。 4. **配置MyBatis**:创建`mybatis-config.xml`,并在...

    Springmvc小系统

    - **web.xml**:传统方式下,需要在该文件中配置 DispatcherServlet 和 ContextLoaderListener。 - **SpringMVC 配置文件**:定义 HandlerMapping、ViewResolver 等组件,以及 Controller 的映射规则。 - **注解...

    Spring mvc + Spring + Spring jdbc 整合 demo.rar

    - `web.xml`:配置Spring MVC的DispatcherServlet和ContextLoaderListener。 - `applicationContext.xml`:定义Spring容器的Bean,包括数据源、事务管理器、Service和DAO。 - `pom.xml`:Maven项目配置文件,包含...

    springMVC+Ibatis搭建

    7. 配置web.xml:设置DispatcherServlet和ContextLoaderListener,启动Spring的上下文加载。 8. 测试:运行项目,验证各个组件是否正常工作。 通过这样的集成,你可以利用SpringMVC的强大功能处理HTTP请求,同时...

    SSM整合开发.docx

    在SSM整合中,SpringMVC容器和Spring容器的关系尤为重要。SpringMVC容器是Spring容器的子容器,这意味着Controller可以从SpringMVC容器访问到由Spring容器管理的Service对象,从而实现业务逻辑的流转。这种设计增强...

    intellij idea SSM框架(SpringMVC-Spring-Mybatis)整合

    8. 配置web.xml:添加DispatcherServlet和ContextLoaderListener配置。 9. 测试:编写测试类或者通过IntelliJ IDEA的Run功能进行功能验证。 五、IntelliJ IDEA中的辅助工具 IntelliJ IDEA提供了一些方便SSM开发的...

    spring、springmvc、mybatis相结合的ssm框架整合实战及项目文件和原理解析

    - 首先,Web容器加载`web.xml`,其中定义了Spring的DispatcherServlet和ContextLoaderListener。 - ContextLoaderListener会先加载`applicationContext.xml`,初始化Spring的ApplicationContext。 - 接着,...

    java 三大框架整合

    接着,配置web.xml文件,设置DispatcherServlet和ContextLoaderListener。在src/main/resources下创建Spring的配置文件,如applicationContext.xml和servlet-context.xml,用于定义Bean和Spring MVC的配置。同时,...

    简单的SpringMVC+mybatis整合

    2. **创建SpringMVC配置**:编写`web.xml`文件,这是Web应用的部署描述符,用来配置SpringMVC的DispatcherServlet和ContextLoaderListener。DispatcherServlet负责处理HTTP请求,而ContextLoaderListener则初始化...

    spring底层的学习之路

    2. 配置Spring MVC:创建web.xml文件,配置DispatcherServlet和ContextLoaderListener。 3. 创建Controller:编写处理HTTP请求的Controller类,使用@RequestMapping注解映射URL。 4. 定义Service和DAO:分别处理业务...

    springMVC注解+hibernate

    3. `web.xml` - Web应用的部署描述符,配置DispatcherServlet和ContextLoaderListener。 4. `Controller`类 - 使用Spring MVC注解处理HTTP请求,调用Service层方法。 5. `Service`类 - 业务逻辑层,通常使用@...

Global site tag (gtag.js) - Google Analytics