基于springMVC web.xml中的配置加载顺序

 更新时间:2021年09月29日 17:04:57   作者:前行的道路  
这篇文章主要介绍了springMVC web.xml中的配置加载顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springMVC web.xml中的配置加载顺序

在这里就不详细说web.xml的文件中的具体配置,就简单说明一下其中配置信息的加载顺序:

在web.xml文件中元素的加载顺序与它们在 web.xml 文件中的先后顺序无关。

加载的顺序是:context-param->listener -> filter -> servlet ,其中context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,然而对于某些配置节而言,它们出现的顺序是有先后关联的。

这里在补充一下在配置中遇到的一下问题以及解决方式:

在web.xml中定义的spring的配置文件一般有两个

1、Spring上下文环境的配置文件

applicationContext.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>

2、SpringMVC配置文件

spring-servlet.xml

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

加载顺序是

首先加载Spring上下文环境配置文件,然后加载SpringMVC配置文件,并且如果配置了相同的内容,SpringMVC配置文件会被优先使用。 所以这里需要注意一个问题,一定要注意SpringMVC配置文件内容不要把Spring上下文环境配置文件内容覆盖掉。

比如在Spring上下文环境配置文件中先引入service层,然后又加入了事务:

  <context:component-scan base-package="com.acms.service"></context:component-scan>
    <!-- define the transaction manager -->
    <bean id="transactionManagerOracle"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSourceOracle" />
    </bean>
 
    <tx:annotation-driven transaction-manager="transactionManagerOracle" />

但是在SpringMVC配置文件中却默认引入所有类(当然也包括service层),但是没有加入事务

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

那么这时事务功能是无法起作用的,也就是代码中加入@Transactional注解是无效的。所以为了防止这种问题一般是在Spring上下文配置文件中引入所有的类,并且加上事务:

 <context:component-scan base-package="com.acms"></context:component-scan>
    <!-- define the transaction manager -->
    <bean id="transactionManagerOracle"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSourceOracle" />
    </bean>
 
    <tx:annotation-driven transaction-manager="transactionManagerOracle" />

而在SpringMVC配置文件中只引入controller层:

<context:component-scan base-package="com.acms.controller" />
<context:component-scan base-package="com.acms.*.controller" />

web.xml加载顺序及Spring包扫描注意

1、web.xml文件中配置文件加载顺序

web.xml文件中,我们一般会配置一些工程启动时需加载的配置文件.比如:SpringMVC工程开发时,

我们一般是会有两个xml的配置文件。一个上下文配置文件applicationContext.xml,另一个就是springMVC的配置文件servlet-context.xml文件.

加载顺序:

1. 服务器启动时,首先会找web.xml文件,加载web.xml文件中配置文件;

2.找到 web.xml后,首先加载上下文配置文件;也就是<context-param></context- param>标签中初始化文件.其可用通配符的方式指定路径加载多个文件;比如:application*.xml.

3.加载监听器;<listener>...</listener>

4.加载过滤器;<filter>...</filter>

5.加载Servlet;<servlet></servlet>。比如SpringMVC的配置文件servlet-context.xml。

2、SpringMVC配置事务管理时

@Service,@Controller包文件扫描时配置注意事项:

1. 当我们在applicationContext.xml中添加了Spring的事务配置,而在servlet-context.xml中添加扫描@service包路径

<context:component-scan base-package="**.*.service" />时,则当我们在Service中方法添加事务注解时,会发现事务没有起作用.而把<context:component-scan base-package="**.*.service" />放在和事务配置的同一个xml配置文件时,就可以了.总的来说就是Service层要在Controller层先被扫描.

2. 当在applicationContext.xml文件中添加了扫描Service包的路径<context:component-scan base-package="com.cn.service.*" />时,又同时在servlet-context.xml文件中添加扫描<context:component-scan base-package="com.cn.*" />时,Spring事务也不会起作用。因为SpringMVC中配置文件中配置会覆盖applicationContext.xml中内容.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot中Bean定义方调用方式解析

    Spring Boot中Bean定义方调用方式解析

    这篇文章主要介绍了Spring Boot中Bean定义方调用方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 新手学习JQuery基本操作和使用案例解析

    新手学习JQuery基本操作和使用案例解析

    这篇文章主要介绍了新手学习JQuery基本操作和使用案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • spring+hibernate 两种整合方式配置文件的方法

    spring+hibernate 两种整合方式配置文件的方法

    本篇文章主要介绍了spring+hibernate 两种整合方式配置文件的方法,主要有两种方式 1、注解方式 2、xml方式实现,有兴趣的可以了解一下。
    2017-04-04
  • Java设计模式之抽象工厂模式AbstractFactoryPattern详解

    Java设计模式之抽象工厂模式AbstractFactoryPattern详解

    这篇文章主要介绍了Java设计模式之抽象工厂模式AbstractFactoryPattern详解,抽象工厂模式是一种软件开发设计模式,抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来,需要的朋友可以参考下
    2023-10-10
  • Java多线程Future实现优雅获取线程的执行结果

    Java多线程Future实现优雅获取线程的执行结果

    这篇文章主要为大家详细介绍了Java如何利用Future实现优雅获取线程的执行结果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • Java基础学习笔记之数组详解

    Java基础学习笔记之数组详解

    这篇文章主要介绍了Java基础学习笔记之数组,结合实例形式详细分析了java的基本概念、定义、迭代、输出、反转、排序等常用操作技巧,需要的朋友可以参考下
    2019-08-08
  • Spring Security CsrfFilter过滤器用法实例

    Spring Security CsrfFilter过滤器用法实例

    这篇文章主要介绍了Spring Security CsrfFilter过滤器用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring中@PostConstruct的实现方法

    Spring中@PostConstruct的实现方法

    大多数java程序员都使用过@PostConstruct注解,它的作用就是在Bean初始化完成后执行,相当于我们常说的init()方法,但是我们看@PostConstruct只有单单的一个注解,它到底是如何实现在Bean初始化完成后就被调用的呢,本文将详细给大家介绍一下
    2023-06-06
  • Java异常处理运行时异常(RuntimeException)详解及实例

    Java异常处理运行时异常(RuntimeException)详解及实例

    这篇文章主要介绍了 Java异常处理运行时异常(RuntimeException)详解及实例的相关资料,需要的朋友可以参考下http://time.qq.com/?pgv_ref=aiotime
    2017-05-05
  • java基于控制台的学生学籍管理系统

    java基于控制台的学生学籍管理系统

    这篇文章主要为大家详细介绍了java基于控制台的学生学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论