spring事务和aop同时使用
- 使用aop的地方设置order如下:
@Order(1)
@Component
@Aspect
public class AopDaoRunTime {
private static final Logger LOGGER = LoggerFactory.getLogger(AopDaoRunTime.class);
@Around("execution(* com.qunar.lfz.dao.impl.*.*(..))")
public Object printDaoTime(ProceedingJoinPoint point) {
String methodName = point.getSignature().getName();
Object result = null;
try {
long startTime = System.currentTimeMillis();
result = point.proceed();
long endTime = System.currentTimeMillis();
LOGGER.info("{}方法执行时间为{}ms", methodName, endTime - startTime);
} catch (Throwable e) {
LOGGER.error("获得dao执行方法时间出错", e);
return null;
}
return result;
}
}
- 配置spring事务和aop的xml:
<aop:aspectj-autoproxy proxy-target-class="true" />
<tx:annotation-driven transaction-manager="transactionManager" order="2"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="xxx"/>
</bean>
- spring手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();