上一节我们说了spring编程式事物管理,但是总感觉还是要在每个service层的方法内嵌或者是外套事物管理代码,造成业务逻辑与事物耦合在一起了,还好有spring aop为我们管理了事物。下面我们来看下怎么实现:
业务层代码
package com.hbut.inspiration.service.impl
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hbut.inspiration.entity.User;
import com.hbut.inspiration.map.MainMap;
import com.hbut.inspiration.service.MainService;
@Service
public class MainServiceImpl implements MainService{
@Autowired
private MainMap mainMap;
public List<User> doUserInfo(User user) {
List<User> result=null;
try {
mainMap.insertUserInfo(user);
result=mainMap.getUserInfo();
} catch (Exception e1) {
e1.printStackTrace();
}
return result;
}
然后重点是我们在spring的配置文件下配置事物管理
//定义数据源
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxWait" value="${jdbc.maxWait}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" /> //声明事物由spring管理
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager"> //定义aop的通知,即对哪些方法进行管理
<tx:attributes> //声明一些方法的事物属性
<tx:method name="get*" read-only="true" /> //声明get开头的方法是只读的
<tx:method name="query*" read-only="true" //声明query开头的方法是只读的
<tx:method name="do*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
//当方法是以do开头的时候,新建事务,如果当前存在事务,把当前事务挂起,当报异常时回滚
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
</tx:attributes>
</tx:advice>
//声明一个aop管理 pointcut为切点,execution表示service包下以及所有子包下的所有方法,advice-ref为通知指向 我们上面定义的通知。
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* com.hbut.inspiration.service..*.*(..))" advice-ref="txAdvice" />
</aop:config>
这样用spring aop管理事物就完成了。