spring中的事務是經過aop來實現的,當咱們本身實現aop攔截的時候,會遇到跟spring的事務aop執行的前後順序問題,好比說動態切換數據源的問題,若是事務在前,數據源切換在後,會致使數據源切換失效,因此就用到了Order(排序)這個關鍵字。spring
咱們能夠經過在@AspectJ的方法中實現org.springframework.core.Ordered這個接口來定義order的順序,order的值越小,說明越先被執行。示例代碼以下:bash
/**
* 多數據源,切面處理類
*
* @author 文希
* @create 2019-04-25 15:10
**/
@Aspect // 開啓切面
@Component
public class DataSourceAspect implements Ordered { // 時間Ordered接口
private Logger logger = LoggerFactory.getLogger(getClass());
// 攔截DataSource下面的類
@Pointcut("@annotation(com.hm.admin.datasources.annotation.DataSource)")
public void dataSourcePointCut() {
}
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataSource ds = method.getAnnotation(DataSource.class);
if (null == ds) {
DynamicDataSource.setDataSource(DataSourceNames.FIRST);
logger.debug("set datasource is " + DataSourceNames.FIRST);
}
else {
DynamicDataSource.setDataSource(ds.name());
logger.debug("set datasource is " + ds.name());
}
try {
return point.proceed();
} finally {
DynamicDataSource.clearDataSource();
logger.debug("clean datasource");
}
}
@Override
public int getOrder() {
return 1;
}
}
複製代碼
在事務配置的地方也配置order字段,代碼以下: 《註解方式配置事務》ide
<tx:annotation-driven transaction-manager="transactionManager" order="2"/>
複製代碼
這樣就實現了咱們本身寫的aop在事務介入以前就執行了。ui