注解定义为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