註解定義爲CatAnnotation,代碼以下:java
import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Retention(RUNTIME) @Target(ElementType.METHOD) public @interface CatAnnotation { }
切面使用註解,類CatAop,代碼以下:code
import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import com.dianping.cat.Cat; import com.dianping.cat.message.Transaction; import com.niwodai.inf.cat.dubbo.DubboCat; @Aspect public class CatAop { @Around(value = "execution(* com.niwodai..*.*(..))") public Object aroundMethod(ProceedingJoinPoint pjp) { Object o = null; //開關未打開,則直接跳過 if(!DubboCat.isAOPEnable()){ try{ o = pjp.proceed(); }catch(Throwable e){ } return o; } MethodSignature joinPointObject = (MethodSignature) pjp.getSignature(); Method method = joinPointObject.getMethod(); boolean flag = method.isAnnotationPresent(CatAnnotation.class); if (flag) { Transaction t = Cat.newTransaction("method", method.getName()); try { //繼續執行方法 o = pjp.proceed(); t.setStatus(Transaction.SUCCESS); t.complete(); } catch (Throwable e) { t.setStatus(e); Cat.logError(e); } finally { t.complete(); } } else { try { o = pjp.proceed(); } catch (Throwable e) { } } return o; } }
基本思路: 先判斷aop監控是否打開,若是沒有打開,直接發起調用;若是打開了,則在調用先後封裝Cat監控。這裏須要注意點aop路徑,結合本身項目更改aop監控路徑。get