spring core包中的order做用

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

相關文章
相關標籤/搜索