spring mvc+mybatis+ spring 基于全注解事务配置

虾米哥 阅读:666 2021-03-31 22:10:40 评论:0

spring mvc 自动扫描注解时,不需要扫描@Service

<!-- 扫描所有的controller 但是不扫描service-->   
	<context:component-scan base-package="com.wlsq">     	 
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />   
	</context:component-scan>

spring  自动扫描时,不需要扫描@Controller,并开启事务注解机制

   <!-- 开启事务注解驱动 -->   
      <tx:annotation-driven />     
                       
     <context:component-scan base-package="com.wlsq"> 
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />  
	 </context:component-scan>

重点:

Spring MVC启动时的配置文件,包含组件扫描、url映射以及设置freemarker参数,让spring不扫描带有@Service注解的类。为什么要这样设置?因为servlet-context.xml与service-context.xml不是同时加载,如果不进行这样的设置,那么,spring就会将所有带@Service注解的类都扫描到容器中,等到加载service-context.xml的时候,会因为容器已经存在Service类,使得cglib将不对Service进行代理,直接导致的结果就是在service-context中的事务配置不起作用,发生异常时,无法对数据进行回滚。


项目配置源文件

spring-mvc.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:p="http://www.springframework.org/schema/p" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
                        http://www.springframework.org/schema/context   
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd   
                        http://www.springframework.org/schema/mvc   
                        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 
 
 
	<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> 
	<mvc:annotation-driven /> 
	<mvc:default-servlet-handler /> 
	<context:annotation-config /> 
	 
	<!-- 扫描所有的controller 但是不扫描service-->   
	<context:component-scan base-package="com.wlsq">     	 
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />   
	</context:component-scan> 
 
	<!-- 声明DispatcherServlet不要拦截下面声明的目录 --> 
	<mvc:resources location="/js/" mapping="/js/**" /> 
	<mvc:resources location="/images/" mapping="/images/**" /> 
	<mvc:resources location="/css/" mapping="/css/**" /> 
	<mvc:resources location="/common/" mapping="/common/**" /> 
	<!--避免IE执行AJAX时,返回JSON出现下载文件 --> 
	<bean id="mappingJacksonHttpMessageConverter" 
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
	</bean> 
	<!--Spring mvc 返回json --> 
	<bean id="stringConverter" 
		class="org.springframework.http.converter.StringHttpMessageConverter"> 
		<property name="supportedMediaTypes"> 
			<list> 
				<value>text/html;charset=UTF-8</value> 
			</list> 
		</property> 
	</bean> 
	<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> 
	<bean 
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
		<property name="messageConverters"> 
			<list> 
				<ref bean="mappingJacksonHttpMessageConverter" />	<!-- JSON转换器 --> 
				<ref bean="stringConverter" /> 
			</list> 
		</property> 
	</bean> 
	<!-- 定义跳转的文件的前后缀 ,视图模式配置 --> 
	<bean 
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
		<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> 
		<property name="prefix" value="/backstage/jsp/" /> 
		<property name="suffix" value=".jsp" /> 
		 
	</bean> 
 
	 
 
 
 
 
	<!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> 
	<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" /> 
	</bean> 
 
 
 
 
 
 
 
 
 
 
</beans>


spring-mybatis.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:p="http://www.springframework.org/schema/p" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:tx="http://www.springframework.org/schema/tx" 
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
                        http://www.springframework.org/schema/context   
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd   
                        http://www.springframework.org/schema/tx 
                        http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
                        http://www.springframework.org/schema/aop  
                        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
                        http://www.springframework.org/schema/mvc   
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 
                         
     
      <!-- 开启事务注解驱动 -->   
      <tx:annotation-driven />     
                       
     <context:component-scan base-package="com.wlsq"> 
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />  
	 </context:component-scan> 
	 
	<!-- 引入配置文件 --> 
	<bean id="propertyConfigurer" 
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:jdbc.properties" /> 
	</bean> 
		 
	 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
      <!-- 基本属性 url、user、password --> 
      <property name="url" value="${url}" /> 
      <property name="username" value="${username}" /> 
      <property name="password" value="${password}" /> 
 
      <!-- 配置初始化大小、最小、最大 --> 
      <property name="initialSize" value="1" /> 
      <property name="minIdle" value="1" />  
      <property name="maxActive" value="20" /> 
 
      <!-- 配置获取连接等待超时的时间 --> 
      <property name="maxWait" value="60000" /> 
 
      <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
      <property name="timeBetweenEvictionRunsMillis" value="60000" /> 
 
      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
      <property name="minEvictableIdleTimeMillis" value="300000" /> 
 
      <property name="validationQuery" value="SELECT 'x'" /> 
      <property name="testWhileIdle" value="true" /> 
      <property name="testOnBorrow" value="false" /> 
      <property name="testOnReturn" value="false" /> 
 
      <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 
      <property name="poolPreparedStatements" value="true" /> 
      <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> 
 
      <!-- 配置监控统计拦截的filters --> 
      <property name="filters" value="stat" />  
  </bean> 
	 
 
	<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> 
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
		<property name="dataSource" ref="dataSource" /> 
		<!-- 自动扫描mapping.xml文件 --> 
		<property name="mapperLocations" value="classpath:com/wlsq/mapper/*.xml"></property> 
	</bean> 
 
	<!-- DAO接口所在包名,Spring会自动查找其下的类 --> 
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
		<property name="basePackage" value="com.wlsq.dao" /> 
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 
	</bean> 
 
	<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> 
	<bean id="transactionManager" 
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
		<property name="dataSource" ref="dataSource" /> 
	</bean> 
	 
	 
 
</beans>

我的事务管理主要集中在:service 层进行控制

	 
	@Transactional(readOnly = false,propagation=Propagation.REQUIRED)   
	@Override 
	public int insert(User record) { 
		// TODO Auto-generated method stub 
		int j=this.userMapper.insert(record); 
		int i = 1/0;; 
		return j; 
	}


事务的配置规则:以方法名进行甄别(规则如下)

 <span style="white-space:pre">	</span>     <tx:method name="delete*" propagation="REQUIRED" /> 
            <tx:method name="insert*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
            <tx:method name="find*" read-only="true" /> 
            <tx:method name="get*" read-only="true" /> 
            <tx:method name="select*" read-only="true" />







标签:MyBatis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号