在java框架这个话题,前几篇文章是基于搭建ssm项目框架,以及web.xml的配置讲解,本篇主要就ssm框架的其他配置文件进行深入讲解,他们分别是:1、application-context.xml;2、spring-mvc.xml。
回顾一下application-context.xml和spring-mvc.xml在web.xml中的配置是怎样的。
目录
(0)前沿
(1)application-context.xml配置
1、首先介绍一下启动一个项目的整体流程:
2、现在开始正式讲解applicationContext.xml中的配置内容
(2)sping-mvc.xml的配置
1.自动扫描
2.注解驱动
3.静态资源处理
4.避免IE执行AJAX时,返回JSON出现下载文件
5.启动SpringMVC的注解功能,完成请求和注解POJO的映射
6.配置文件上传
7.配置viewResolver视图解析
8.定义跳转的文件的前后缀 ,视图模式配置
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中配置如下:
-
-
<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。
开始进入正题。
spring的核心配置文件的名字 叫做 applicationContext.xml,后期也可以通过配置文件中的配置修改名称,在web.xml中进行如下配置:
1、扫描service层和dao层注解(spring中扫描service,然后再在SpringMVC中扫描controller中扫描controller。 因为如果Controller在主容器中进行扫描的话会扫描到原样的service,那时service还没有进行事务处理可能会引起事务失效)
如图所示:首先是开启注解扫描,其次是设置注解扫描的包:com.dao和com.service
A、
启动spring的一些注解,主要包括:向 Spring 容器注册如下4 个BeanPostProcessor。
注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。
但是配置更加简单,方便,不需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供
B、 设置使用注解的类所在的包 主要是dao层和service层,剔除controller层注解扫描
注意,这部分主要是扫描项目中除了controller以外的其他层的注解。配置这部分的目的是在于扫描service包和dao包里面的类,只要有@Service或者@Repository就注册成spring容器中的Bean,下次可以通过@Autowired直接注入。
如果有B的配置,可以不需要A的配置,
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的提交和关闭。
资料:https://blog.csdn.net/liuxiao723846/article/details/52424802
applicationContext.xml配置:Spring和Mybatis整合有两种方式
方式一:需要mapper.xml文件,mapper文件里面写sql语句,UserMapper接口类里面不写sql语句
方式二:不需要mapper.xml文件,但是需要在UserMapper里面写sql语句
详细资料:https://www.cnblogs.com/ClassNotFoundException/p/6425558.html
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。
资料详解:https://www.cnblogs.com/daxin/p/3545040.html
6、配置事务管理器(声明式事务:用面向切片编程AOP的思想,来管理事务;编程式:TransactionTemplate)
-
-
<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>
-
-
<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"/>
-
-
<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:config>
-
<aop:pointcut id="serviceMethods" expression="execution(public * com.service..*(..))" />
-
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
-
aop:config>
-
-
-
<aop:aspectj-autoproxy proxy-target-class="true" />
-
-
-
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
事务管理的两种方式:
事务管理对于企业应用而言,是至关重要的,即使出现异常情况,他也可以保证数据的一致性。事务的管理方式有两种:1、支持编程式事务管理‘2、支持声明式事务管理方式。编程式事务管理是使用:TransactionTemplate,声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后,根据执行情况提交或者回滚事务。声明式事务的优点是可以基于注解@Transactional来管理,很方便,但是不足之处在于粒度较大,只能作用到方法级别,不能像编程式事务那样,做到代码块级别。’
详情介绍:https://www.cnblogs.com/sword-successful/p/7274929.html
web项目启动时,读取web.xml配置文件,首先解析的是applicationContext.xml文件,其次才是sping-mvc.xml文件,sping-mvc.xml文件中主要的工作是:启动注解、扫描controller包注解;静态资源映射;视图解析(defaultViewResolver);文件上传(multipartResolver);返回消息json配置。