您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Spring中@Transactional如何配置,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
背景:
spring老版本是使用TransactionProxyFactoryBean來實現對spring的事務進行配置(缺點自己google,一大堆的缺點)
spring2.x引入了AOP(面向切面的編程)
當初項目也是喜歡用spring xml方式的配置,后來項目使用spring3.x版本,看到了@Transactional注解,個人覺得挺方便和實用。(具體什么原因,說不清)
上代碼
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <!-- ################# start ################ --> <context:component-scan base-package="com.xun.spring3.src"></context:component-scan> <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:/db.properties</value> </property> </bean> <!-- ################### end ############## --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation"> <value>classpath:/sqlmap-config.xml</value> </property> <property name="mappingLocations"> <value>classpath*:/sqlmap/*.xml</value> </property> </bean> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}" /> <property name="filters"><value>stat</value></property> <property name="maxActive"><value>20</value></property> <property name="initialSize"><value>1</value></property> <property name="maxWait"><value>60000</value></property> <property name="minIdle"><value>1</value></property> <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property> <property name="minEvictableIdleTimeMillis"><value>300000</value></property> <property name="validationQuery"><value>SELECT 'x'</value></property> <property name="testWhileIdle"><value>true</value></property> <property name="testOnBorrow"><value>false</value></property> <property name="testOnReturn"><value>false</value></property> <property name="poolPreparedStatements"><value>true</value></property> <property name="maxOpenPreparedStatements"><value>20</value></property> </bean> <!-- 其實 不涉及到分布式事務的話,無需定義這個模板 sqlMapClient,因為basedao已經SqlMapClientDaoSupport這個類, SqlMapClientDaoSupport中已經有SqlMapClientTemplate這個屬性了。 --> <!-- <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> <property name="sqlMapClient" ref="sqlMapClient"></property> </bean> --> <!-- transaction confige --> <!-- 作用:開啟對@Transactional注解的加工處理,以織入事務管理切面 <tx:annotation-driven>屬性說明: (1):屬性transaction-manager:指定事務管理器名字,默認為transactionManager,當使用其他名字時需要明確指定 (2):proxy-target-class: 如果為true,Spring將通過創建子類來代理業務類; 如果為false(默認),則使用基于接口來代理。 (ps:如果使用子類代理,需要在類路徑中添加CGLib.jar類庫) (3):order:如果業務類除事務切面外,還需要織入其它的切面(或者多個事務切面),通過該屬性來控制切面在目標連接點的織入順序 --> <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" /> <!--proxy-target-class:默認false表示使用JDK代理,如果為true將使用CGLIB代理--> <!-- 使用CGLIB的話需要加上aspectjrt和aspectjweaver 的jar--> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 對于cobar對數據源的時候我們用這個 --> <!--<bean id="txManager" class="com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManager"> <property name="cobarDataSourceService" ref="dataSources" /> </bean>--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource"></property> </bean> </beans>
package com.xun.spring3.src.dao; import com.ibatis.sqlmap.client.SqlMapClient; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import javax.annotation.PostConstruct; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * 要求每個dao的命名以 Dao結尾 * 泛型 ENTITY - 具體哪個實體 * 泛型 PRIMARYKEY - 具體主鍵的類型 * @Date : 2014/9/7 0007 20:41 * @From : spring3-test * @Author : hebad90@163.com */ public class BaseDao<ENTITY, PRIMARYKEY> extends SqlMapClientDaoSupport { @Autowired private SqlMapClient sqlMapClient; @PostConstruct private void initSuper() { /** * 初始化父類 */ super.setSqlMapClient( sqlMapClient ); } private Class entityClass ; private String ibatisNamespace; protected BaseDao() { Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType)genType).getActualTypeArguments(); entityClass = (Class)params[0]; /** * 獲取當前 ibatis的命名空間 XxxDao 即命名空間為 xxx */ this.ibatisNamespace = getIbatisNamespace( getClass() ); System.out.println( "初始化當前環境成功,ibatisNamespace=["+this.ibatisNamespace+"],entityClass=[" + entityClass + "]" ); } public PRIMARYKEY insert( ENTITY entity ) { return(PRIMARYKEY)super.getSqlMapClientTemplate().insert( this.ibatisNamespace + ".insert", entity ); } public int update( ENTITY entity ) { return super.getSqlMapClientTemplate().update( this.ibatisNamespace + ".update", entity ); } public ENTITY queryById( PRIMARYKEY primarykey ) { return ( ENTITY ) super.getSqlMapClientTemplate().queryForObject( this.ibatisNamespace + ".queryById", primarykey); } public int delete( ENTITY entity ) { return super.getSqlMapClientTemplate().delete( this.ibatisNamespace + ".delete", entity); } ///############################## private String getIbatisNamespace( Class clazz ) { String simpleName = clazz.getSimpleName(); int index = StringUtils.indexOf( simpleName, "Dao" ); return StringUtils.lowerCase( StringUtils.substring( simpleName, 0, index ) ); } }
@Transactional在何處使用?Spring建議我們在業務實現類上使用該注解,因為java的實現不能繼承注解。所以,最好是在業務實現類上注解,這樣不管<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />中的proxy-target-class為true或者false,業務類都會啟用事務機制。
@Transactional的參數怎么使用?
關于“Spring中@Transactional如何配置”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。