基于spring-mvc.xml和application-context.xml的配置与深入理解

 更新时间:2021年08月14日 10:28:30   作者:夏至&未至  
这篇文章主要介绍了spring-mvc.xml和application-context.xml的配置与深入解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前沿

1、application-context.xml是全局的

应用于多个serverlet,配合listener一起使用,web.xml中配置如下:

<!-- 配置监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
 

2、spring-mvc.xml 是spring mvc的配置

web.xml中配置如下:

<!--配置springmvc DispatcherServlet-->
<servlet>
  <servlet-name>springMVC</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:config/spring-mvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  <async-supported>true</async-supported>
</servlet>

application-context.xml这个一般是采用非spring mvc架构,用来加载Application Context。

如果直接采用SpringMVC,只需要把所有相关配置放到spring-mvc.xml中就好,一般spring mvc项目用不到多个serverlet。

开始进入正题。

(1)application-context.xml配置

spring的核心配置文件的名字 叫做 applicationContext.xml,后期也可以通过配置文件中的配置修改名称,在web.xml中进行如下配置:

1、首先介绍一下启动一个项目的整体流程:

  • 1、tomcat启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。
  • 2、紧接着,容器创建一个ServletContext(servlet上下文,全局的),这个web项目的所有部分都将共享这个上下文。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问
  • 3、容器将<context-param>转换为键值对,并交给servletContext。
  • 4、容器创建<listener>中的类实例,创建监听器。 listener中ContextLoaderListener监听器的作用就是启动Web容器时,监听servletContext对象的变化,获取servletContext对象的<context-param>,来自动装配ApplicationContext的配置信息。(即加载applicationContext.xml文件)

2、现在开始正式讲解applicationContext.xml中的配置内容

1、扫描service层和dao层注解(spring中扫描service,然后再在SpringMVC中扫描controller中扫描controller。 因为如果Controller在主容器中进行扫描的话会扫描到原样的service,那时service还没有进行事务处理可能会引起事务失效)

如图所示:首先是开启注解扫描,其次是设置注解扫描的包:com.dao和com.service

A、 <context:annotation-config/> : 自动简化的完成相应bean的声明。

启动spring的一些注解,主要包括:向 Spring 容器注册如下4 个BeanPostProcessor。

  • 1、AutowiredAnnotationBeanPostProcessor @Autowired注解
  • 2、CommonAnnotationBeanPostProcessor @ Resource 、@ PostConstruct、@ PreDestroy
  • 3、PersistenceAnnotationBeanPostProcessor @PersistenceContext注解
  • 4、RequiredAnnotationBeanPostProcessor 这 @Required的注解

注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

<context:annotation-config/>的方式等价于以下的传统方式:

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

但是配置更加简单,方便,不需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明

B、 设置使用注解的类所在的包 主要是dao层和service层,剔除controller层注解扫描

注意,这部分主要是扫描项目中除了controller以外的其他层的注解。配置这部分的目的是在于扫描service包和dao包里面的类,只要有@Service或者@Repository就注册成spring容器中的Bean,下次可以通过@Autowired直接注入。

如果有B的配置,可以不需要A的配置,<context:component-scan base-package=”XX.XX”/> , 该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

2、配置数据库相关内容(这部分内容可以单独用一个spring-mybatis.xml进行配置,本项目没有单独进行配置,而是和applicaitonContext.xml文件一起配置的)

配置db.properties文件-----》配置数据源(dataSource(可以采用数据库连接池),可以配置多个数据源(如果有多个数据库的话))---》配置spring+mybatis(Spring和Mybatis整合有两种方式)----》配置事务(事务管理器、配置事务传播特性、事务aop配置)

首先准备db.properties 配置文件

1、所在项目文件夹的位置:

2、applicationContext.xml文件定位到dbconfig.properties文件

3、dbconfig.properties文件内容

4、在applicationContext.xml中配置数据源,后期需要可以在其中添加多个属性配置。

5、配置spring+mybatis(主要是获取sqlSession对象,通过MapperScannerConfigurer 自动装配SqlSessionFactory 或 SqlSessionTemplate,MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序

创建SqlSessionFactory的过程:

①定义Configuration对象(包括数据源,事务,mapper文件资源以及影响数据库行为属性设置的settings)  
--> ②由Configuration对象创建一个SqlSessionFactoryBuilder对象
--> ③由SessionFactoryBuilder获得SqlSessionFactory实例
--> ④由SqlSessionFactory实例获得SqlSession实例,操作数据库

在 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session。

Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。使用 MyBatis-Spring 之后, 会使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory,然后可以使用下面两种方式使用sqlSession。

1、SqlSessionTemplate;

2、SqlSessionDaoSupport;上面做法没问题,但就是在spring.xml中需要配置所有的dao层实现,把sqlSession或者sqlSessionFactory注入进去,可以使用MapperScannerConfigurer来解决这个问题,MapperScannerConfigurer帮我们自动装配SqlSessionFactory 或 SqlSessionTemplate,因此不需要我们在applicationContext.xml文件中注入sqlSession或者sqlSessionFactory

SqlSessionFactoryBean、SqlSessionFactory、SqlSession、SqlSessionTemplate之间的关系。

SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;SqlSessionFactory是一种生产SqlSession的工厂;SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的一个具体实现。

SqlSessionTemplate介绍:

Mybatis-Spring提供了一种直接使用SqlSession的方式(一个实现了SqlSession接口的SqlSessionTemplate实现类)

  • 1、它是线程安全的,可以被多个Dao同时使用;
  • 2、 它跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的,而且它还可以自己管理Session的提交和关闭。

applicationContext.xml配置:Spring和Mybatis整合有两种方式

方式一:需要mapper.xml文件,mapper文件里面写sql语句,UserMapper接口类里面不写sql语句

方式二:不需要mapper.xml文件,但是需要在UserMapper里面写sql语句

5.1、需要配置MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring,这部分实现mapper.xml文件映射成mapper接口类的实现类,自动注入到spring中,这样我们就不用写mapper接口的实现类了。

原理:Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理,MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。(需要增加对MapperFactoryBean源码的理解

注 意 , 没 有 必 要 去 指 定 SqlSessionFactory 或 SqlSessionTemplate , 因 为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配。但是,如果你使 用了一个 以上的 DataSource ,那 么自动 装配可 能会失效 。这种 情况下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名 称来使用。这就是它如何来配置的,注意 bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的 ref。

6、配置事务管理器(声明式事务:用面向切片编程AOP的思想,来管理事务;编程式:TransactionTemplate)

<!-- 对dataSource 数据源进行事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
 
<!-- 事务管理 通知,对不同的方法进行不同的事务管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 对insert,create,update,modify,delete,remove 开头的方法进行事务管理,只要有异常就回滚 -->
        <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
        <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
        <!-- find,get,select,count开头的方法,开启只读,提高数据库访问性能 -->
        <tx:method name="find*" read-only="true" />
        <tx:method name="get*" read-only="true" />
        <tx:method name="select*" read-only="true" />
        <tx:method name="count*" read-only="true" />
        <!-- 对其他方法 使用默认的事务管理 -->
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>
 
<!-- 事务 aop 配置     
<aop:pointcut>切入点    <aop:advice>需要注入的方法   <aop:advisor> 适配器,把注入的方法注入切入点的位置,是连接pointcut跟advice的工具-->
 
<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(public * com.service..*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
 
<!-- 配置使Spring采用CGLIB代理 --><!-- 开启基于@AspectJ切面的注解处理器 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
 
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

事务管理的两种方式:

事务管理对于企业应用而言,是至关重要的,即使出现异常情况,他也可以保证数据的一致性。

事务的管理方式有两种:

  • 1、支持编程式事务管理、
  • 2、支持声明式事务管理方式。编程式事务管理是使用:TransactionTemplate,声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后,根据执行情况提交或者回滚事务。声明式事务的优点是可以基于注解@Transactional来管理,很方便,但是不足之处在于粒度较大,只能作用到方法级别,不能像编程式事务那样,做到代码块级别。

(2)sping-mvc.xml的配置

web项目启动时,读取web.xml配置文件,首先解析的是applicationContext.xml文件,其次才是sping-mvc.xml文件,sping-mvc.xml文件中主要的工作是:启动注解、扫描controller包注解;静态资源映射;视图解析(defaultViewResolver);文件上传(multipartResolver);返回消息json配置。

1.自动扫描

<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.javen.controller" />

2.注解驱动

<!-- 扩充了注解驱动,可以将请求参数绑定到控制参数-->
<mvc:annotation-driven />

3.静态资源处理

<!-- 静态资源处理 css js images -->
<mvc:resources location="/resources/**" mapping="/resource/"/>

4.避免IE执行AJAX时,返回JSON出现下载文件

<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter" 
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>

5.启动SpringMVC的注解功能,完成请求和注解POJO的映射

<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/><!-- JSON转换器 -->
</list>
</property>
</bean>

6.配置文件上传

<!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 上传文件最大值 -->
<property name="maxUploadSize" value="10485760000"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960"/>
<!-- 启用是为了推迟文件解析,以便捕获文件大小异常 -->
<property name="resolveLazily" value="true"/>
</bean>

7.配置viewResolver视图解析

<!-- 配置viewResolver。可以用多个viewResolver。使用order属性排序。InternalResourceViewResolver 放在最后 -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1"></property>
<property name="mediaTypes">
<map>
<!-- 告诉视图解析器,返回的类型为json格式 -->
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="htm" value="text/htm" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- ModelAndView里的数据变成JSON -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
<property name="ignoreAcceptHeader" value="true"></property>
</bean>

8.定义跳转的文件的前后缀 ,视图模式配置

<!-- 定义跳转的文件的前后缀 ,视图模式配置--> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> 
<property name="prefix" value="/WEB-INF/jsp/" /> 
<property name="suffix" value=".jsp" /> 
</bean>

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

相关文章

  • Java Swing组件单选框JRadioButton用法示例

    Java Swing组件单选框JRadioButton用法示例

    这篇文章主要介绍了Java Swing组件单选框JRadioButton用法,结合具体实例形式分析了Swing单选框JRadioButton的使用方法及相关操作注意事项,需要的朋友可以参考下
    2017-11-11
  • MybatisPlus整合Flowable出现的坑及解决

    MybatisPlus整合Flowable出现的坑及解决

    这篇文章主要介绍了MybatisPlus整合Flowable出现的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • common-upload上传文件功能封装类分享

    common-upload上传文件功能封装类分享

    本文介绍一个common-upload上传封装类,为了更方便的上传文件,对common-upload进行了一个简单的封装,大家参考使用吧
    2014-01-01
  • SpringBoot 启动报错Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379问题的解决方案

    SpringBoot 启动报错Unable to connect to 

    这篇文章主要介绍了SpringBoot 启动报错Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379问题的解决方案,文中通过图文结合的方式给大家讲解的非常详细,对大家解决问题有一定的帮助,需要的朋友可以参考下
    2024-10-10
  • 全面解析SpringBoot自动配置的实现原理

    全面解析SpringBoot自动配置的实现原理

    这篇文章主要介绍了全面解析SpringBoot自动配置的实现原理的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot集成quartz实现定时任务

    SpringBoot集成quartz实现定时任务

    这篇文章主要介绍了如何使用SpringBoot整合Quartz,并将定时任务写入库中(持久化存储),还可以任意对定时任务进行如删除、暂停、恢复等操作,需要的可以了解下
    2023-09-09
  • Java的延迟队列之DelayQueue解读

    Java的延迟队列之DelayQueue解读

    这篇文章主要介绍了Java的延迟队列之DelayQueue解读,DelayQueue的底层存储是一个PriorityQueue,PriorityQueue是一个可排序的Queue,其中的元素必须实现Comparable接口的compareTo方法,需要的朋友可以参考下
    2023-12-12
  • 使用Java获取Json中的数据简单示例

    使用Java获取Json中的数据简单示例

    开发过程中经常会遇到json数据的处理,而单独对json数据进行增删改并不方便,下面这篇文章主要给大家介绍了关于使用Java获取Json中的数据,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • IntelliJ IDEA 2022.2 正式发布新功能体验

    IntelliJ IDEA 2022.2 正式发布新功能体验

    IntelliJ IDEA 2022.2为远程开发功能带来了多项质量改进,使其更美观、更稳定,新版本还具有多项值得注意的升级和改进,下面跟随小编一起看看IDEA 2022.2新版本吧
    2022-08-08
  • IntelliJ IDEA运行bat脚本,自动taskkill端口进程

    IntelliJ IDEA运行bat脚本,自动taskkill端口进程

    这篇文章主要介绍了IDEA里面无法运行bat文件的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论