参考:https://blog.51cto.com/zero01/2103687
一.SSM整合步奏
1.导入jar包
Spring:
SpringMVC
Mybatis
第三方的包:log4j,pageHelper,AspectJ,jackson,jstl
mybatis-spring整合包:mybatis当中的有些对象,Spring不能处理。故需要适配包对mybatis当中的对象进行加工处理,使他可以被Spring处理
2搭建SpringMVC
(1)web.xml:
characterEncodingFilter:Spring编码过滤器
HiddenHttpMethodFilter:Rest请求方式处理
DispatcherServlet:加载SpringMVC的配置文件,默认在WEB-INF/"servlet-name"-servlet.xml,可使用init-param具体指定
(2)Spring.xml:
context:component-scan:控制层组件控制
视图解析器(网络资源是图解析器:InternalResourceViewReslover)
MVC驱动
可选:multipartResolver文件上传,拦截器
3.Spring、SpringMVC整合
(1)web.xml
ContextLoaderListener:监听加载Spring配置文件
context-param(默认在WEB-INF/applicationContext.xml)
(2)Spring.xml
扫描组件(排除控制层)
事物管理
4.搭建mybatis
mybatis核心配置文件
mapper接口和mapper映射文件
5.Spring整合mybatis
spring.xml:
properties文件引入
DataSource数据源配置
事物管理器配置
事物管理器开启
sqlSessionFactoryBean:管理sqlSession
mapperScannerConfigurer
Mybatis-Spring
二.web应用当中使用Spring的基本思路
1.Spring如何在web应用当中使用?
1.需要额外引入的jar包
spring-web
spring-webmvc
2.spring的配置文件没有什么不同
3.如何创建IOC容器
1.)非web应用在web容器当中直接创建
2.)web应用应该在服务器被加载的时候创建IOC容器
4.在web应用的其他组建当中如何访问IOC容器
ServletContextListener的contextInitialized(servletContextEvent sce)方法当中创建IOC容器后,可以将其放在ServletContext(application域)的一个属性当中
ServletContextListener的contextInitialized(servletContextEvent sce)方法当中创建IOC容器,ServletContextListener是一个接口,一般我们使用的是它的实现类ContextLoaderListener
<!--
web容器和spring容器整合的监听器
ContextLoaderListener通过classpath:applicationContext.xml(spring配置文件)将web容器和spring容器进行整合
即通过ContextloaderListener加载applicationContext.xml
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2.在web环境下使用spring
1.引用额外的jar包:
spring-web
spring-webmvc
2.spring配置文件,和非web没有不通
3.在web.xml当中加入如下的配置
<!--配置spring配置文件的名称和位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--ServletContextListener的contextInitialized(servletContextEvent sce)方法当中创建IOC容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!--web容器启动和关闭的监听器:只负责监听web容器的启动和关闭-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!--
web容器和spring容器整合的监听器
ContextLoaderListener通过classpath:applicationContext.xml(spring配置文件)将web容器和spring容器进行整合
即通过ContextloaderListener加载applicationContext.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>
</web-app>
spring.xml(applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.mmall" annotation-config="true"/>
<aop:aspectj-autoproxy/>
<import resource="applicationContext-datasource.xml"/>
</beans>
二.SSM整合
1.下载spring,mybatis整合包,spring的包,springmvc的包,mybatis的包,数据库连接包mysql-connect
2.在web.xml当中配置ContextLoaderListener ,让spring的ioc容器跟随web容器一起启动.
<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>
3.在web.xml当中配置springmvc的配置文件信息
<!--springmvc的配置:前端管理器-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--springmvc拦截器-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
4.在web.xml同级目录下创建springmvc的配置文件,dispatcher-servlet.xml,配置一个扫描器:扫描控制器Controller层即可()
5.mybatis配置文件使用generetorConfig.xml
至此ssm整合配置完毕...
1.Spring整合mybatis补充
1.引入Spring-Mybatis的jar包
<!--MyBatis-Spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
2.在spring的配置文件当中配置mybatis的全局配置文件(mybatis全局配置文件的作用是生成sqlSessionfactory),
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property> -->
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:sqlmap/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.demo.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
2.spring整合mybatis 详细说明
Spring整合Mybatis
目的:1.让Spring管理所有的组件,管理mapper实现类,管理事物
然后当service调用dao的时候,只需使用@Autowired即可以实现自动注入mapper
service--->dao @Autowired:自动注入mapper
2.Spring管理事务是十分方便的,我们可以直接在spring当中配置事物,事物的连接,提交,关闭都是事物管理器自动完成,
在事物管理器当中指定datasource,让指定事物管理器去管理这个数据源
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="rollbackOnCommitFailure" value="true"/>
</bean>
开启基于注解的事物
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
transaction-manager是哪个,哪个就开启基于注解的事物
3.spring整合mybatis详细操作
操作:在spring配置文件当中配置
方法1.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--一般不写下面的,如果有一个额外添加mybatis的全局配置文件(不加database,mapper,只加其他额外配置),可以使用如下的配置信息-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!--使用mybatis-scan扫描所有mapper接口的实现,让这些mapper可以自动注入,以后我们要使用这些mapper的时候(调用dao层),直接使用@Autowired注入即可使用-->
<mybatis-spring:scan base-package="com.mmall.dao"/>
要求dao和mapper的名字一模一样,mybatis-spring会自动扫描dao等接口的实现类,然后自动注入
方法2.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--指定mapper.xml文件的位置-->
<property name="mapperLocations" value="classpath*:mappers/*Mapper.xml"></property>
<!--一般不写下面的,如果有一个额外添加mybatis配置,可以使用如下的配置信息-->
<!--
<property name="configLocation" value="classpath:mybatis-config.xml" />
-->
</bean>
<!--base-package:指定mapper接口的包名-->
<mybatis-spring:scan base-package="com.mmall.dao"/>
说明:
<mybatis-spring:scan base-package="com.mmall.dao"/>是最新的写法,以前的写法是,
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mmall.dao"/>
</bean>
MapperScannerConfigurer扫描dao层接口的实现类,以便自动注入
mapper标签和base-package说明:
springmvc只是控制网页的跳转逻辑,其他的业务逻辑组件由spring去管理.
=============================================================
mybatis的mapper标签是用来绑定dao层接口的实现类(mapper.xml)的,所以当我们使用resource,url属性时,直接写mapper.xml即可
但是当我们使用mapper标签的class属性时,就要求dao和mapper同路径同名,这样也可以绑定dao层接口的实现类
=============================================================
在进行spring,mybatis整合的时候,使用的basepackage和class差不多,所以我们要么dao和mapper同名同路径,要么直接在sqlsession当中指定mapper的位置,那么在扫描dao层接口的时候,会自动注入到接口实现类(mapper.xml)当中
=============================================================
总结:
在sqlSessionFactory配置当中需要配置的是连接数据的信息:故,
dataSource:必须的,出了这个属性其他都不是必须的,用以配置数据源
configLocation:非必须,配置mybatis-config.xml位置,我们很少配置,因为大多数常用的配置都可以在sqlSessionFactory里面配置,比如方言
mapperLocations:非必须,配置mapper.xml,如不配置,则要求dao和mapper在同意目录下且名字完全相同。
在mybatis-spring:scan,或者MapperScannerConfigurer配置当中配置basepackage信息:
mybatis-spring:scan的base-package,MapperScannerConfigurer的basePackage都是用来指定dao层接口的,
他会自动将dao层接口的实现类注入到Spring的IOC容器当中。
三.整体配置演示
********************Spring********************
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--Spring希望管理所有的业务组件,SpringMVC只管理控制器组件就可以了,annotation-config:让系统可以识别一些注解-->
<!-- <context:component-scan base-package="com.mmall" annotation-config="true"/> -->
<context:component-scan base-package="com.mmall" annotation-config="true" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--<context:annotation-config/>-->
<!--Spring 用来控制业务逻辑,数据源、事物控制、aop-->
<aop:aspectj-autoproxy/>
<import resource="applicationContext-datasource.xml"/>
<!--Spring整合mybatis的目的:Spring管理所有的组件,管理mapper实现类,管理事物
然后当service调用dao的时候,只需使用@Autowired即可以实现自动注入mapper
-->
</beans>
********************Spring********************
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!--Spring整合mybatis的目的:Spring管理所有的组件,管理mapper实现类,管理事物
然后当service调用dao的时候,只需使用@Autowired即可以实现自动注入mapper
-->
<context:component-scan base-package="com.mmall" annotation-config="true"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="2"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:datasource.properties</value>
</list>
</property>
<property name="fileEncoding" value="utf-8"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="${db.initialSize}"/>
<!-- 连接池的最大值 -->
<property name="maxActive" value="${db.maxActive}"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="${db.maxIdle}"/>
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle" value="${db.minIdle}"/>
<!-- 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制 -->
<property name="maxWait" value="${db.maxWait}"/>
<!--#给出一条简单的sql语句进行验证 -->
<!--<property name="validationQuery" value="select getdate()" />-->
<property name="defaultAutoCommit" value="${db.defaultAutoCommit}"/>
<!-- 回收被遗弃的(一般是忘了释放的)数据库连接到连接池中 -->
<!--<property name="removeAbandoned" value="true" />-->
<!-- 数据库连接过多长时间不用将被视为被遗弃而收回连接池中 -->
<!--<property name="removeAbandonedTimeout" value="120" />-->
<!-- #连接的超时时间,默认为半小时。 -->
<property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>
<!--# 失效检查线程运行时间间隔,要小于MySQL默认-->
<property name="timeBetweenEvictionRunsMillis" value="40000"/>
<!--# 检查连接是否有效-->
<property name="testWhileIdle" value="true"/>
<!--# 检查连接有效性的SQL语句-->
<property name="validationQuery" value="SELECT 1 FROM dual"/>
</bean>
<!--SqlSessionFactoryBean实现了FactoryBean:会创建出sqlSessionFactory
相当于让Spring的IOC容器一启动就代替我们自己去创建sqlSessionFactory,我们自己手动创建是十分低效的
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--如果要使用官方提供的方式(在sqlSessionFactory当中不加载mapper.xml),则需要dao接口的名字和mapper的名字一摸一样,如果不一样,则可以使用如下-->
<!--指定mapper文件的位置-->
<property name="mapperLocations" value="classpath*:mappers/*Mapper.xml" />
<!--
这个属性configLocation是用来指定全局配置文件的位置,即可以配置原来mybatis-conf.xml
<property name="configLocation" value="" />
-->
<!-- 分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--扫描所有mapper接口的实现,让这些mapper可以自动注入,以后我们要使用这些mapper的时候,直接使用@Autowired注入即可使用-->
<!--将该包下的所有mapper接口通过动态代理统一生成动态代理实现类,此时就无需创建mapper对象,因为Spring已经创建好了,此时直接在service当中调用即可-->
<bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mmall.dao"/>
</bean>
<!--扫描所有mapper接口实现的新方式
<mybatis-spring:scan base-package="com.mmall.dao" />
-->
<!-- Spring事务管理:事物管理器DataSourceTransactionManager管理数据库dataSource的事物 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="rollbackOnCommitFailure" value="true"/>
</bean>
<!-- 开启基于注解的事物:使用@Transactional进行声明式事务管理需要声明下面这行 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!--Spring编码过滤器设置编码集为UFT-8-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Rest请求方式处理:处理put/delete-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--监听web容器的启动和关闭-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!--web容器和Spring容器整合的监听器:ContextLoaderListener通过指定的Spring配置文件将Spring配置文件加载进来实现在web容器当中启动Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--如果只配置了监听器ContextLoaderListener未配置context-param则默认Spring配置文件在WEB-INF/applicationContext.xml-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<!--SpringMVC的配置文件,所有的*.do请求都会被拦截-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--默认在WEB-INF下,名字是"servlet-name"-servlet.xml,比如本例当中是dispatcher-servlet.xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/xxx</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
网友评论