像@Transactional一樣利用註解自定義aop切片

chenatu發表於2016-08-02

像@Transactional一樣利用註解自定義aop切片

在spring中,利用@Transactional註解可以很輕鬆的利用aop技術進行事物管理。在實際專案中,直接利用自定義註解實現切片可以大大的提高我們的編碼效率以及程式碼的簡潔性。

實現以上的目標,主要涉及兩方面工作。

  1. 自定義註解

  2. 將註解宣告為切片

自定義註解

介紹註解自定義的文章比較多,這裡簡要介紹一下以下面的程式碼為例。該程式碼要實現一個分散式鎖的程式碼。首先利用@interface來宣告該類為介面類,用@Target來宣告該註解的作用範圍。該例子中ElementType.METHOD, ElementType.TYPE表明該註解作用範圍是方法和類。@Retention註明該註解的作用週期。RetentionPolicy.RUNTIME表明該註解在執行時也是有效的。

package com.whaty.lock.annotation;

import org.springframework.stereotype.Component;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Component
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Lock {

    public LockImpl lockImpl() default LockImpl.MYSQL;

    public enum LockImpl {
        MYSQL, ZOOKEEPER
    }
}

將註解宣告為切片

下面的程式碼是實現註解切片邏輯的程式碼。其中@Aspect用來宣告切片的實現。在這個程式碼裡面,最關鍵的一步是
@Around(value = "@annotation(com.whaty.lock.annotation.Lock)")
這個宣告與普通的註解式宣告切片類似,只是其中@annotation表明該切片作用範圍為宣告的註解作用範圍。

package com.whaty.lock.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LockAspect {
    @Around(value = "@annotation(com.whaty.lock.annotation.Lock)")
    void execute(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 嘗試獲取鎖
        proceedingJoinPoint.proceed();
        // 釋放鎖
    }
}

相關文章