定义节点
public enum NodeEnum {
A("A"),
B("B"),
C("C"),
D("D"),
E("E"),
;
NodeEnum(String desc) {
this.desc = desc;
}
private String desc;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Monitor {
NodeEnum node();
}
定义增强处理类
@Aspect
@Component
@Order(0)
class MonitorHandlerAspect {
@Pointcut("@annotation(com.cp.test.aop.Monitor)")
public void HandlerPointcut() {
}
@Around("HandlerPointcut()")
public <T> T handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
String methodName = pjp.getSignature().getName();
Class<?> classTarget = pjp.getTarget().getClass();
Class<?>[] par = ((MethodSignature) pjp.getSignature()).getParameterTypes();
Method objMethod = classTarget.getMethod(methodName, par);
Monitor monitor = objMethod.getAnnotation(Monitor.class);
try {
T proceed = (T) pjp.proceed();
this.record(monitor);
return proceed;
} catch (Throwable e) {
this.recordException(monitor, e);
throw e;
}
}
private void record(Monitor monitor) {
if (NodeEnum.A.equals(monitor.node())) {
System.out.println("我是正常日志切面处理,监控到被标记A节点的方法执行了,正在记录日志中。。。");
}
}
private void recordException(Monitor monitor, Throwable e) {
if (NodeEnum.A.equals(monitor.node())) {
System.out.println("我是异常日志切面处理,监控到被标记A节点的方法执行时异常了,异常信息是" + e);
}
}
}
定义测试接口
public interface InteTest {
void test();
void proxyTest();
}
实现测试接口
@Service
public class InteTestImpl implements InteTest {
@Override
@Monitor(node = NodeEnum.A)
public void test() {
InteTest proxy = (InteTest) AopContext.currentProxy();
proxy.proxyTest();
System.out.println("我是方法A,我正在执行中。。。");
}
@Override
@Monitor(node = NodeEnum.B)
public void proxyTest() {
System.out.println("我是方法B,我正在执行中。。。");
}
}
定义测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class MonTest {
@Resource
private InteTest inteTest;
@Test
public void test() {
inteTest.test();
}
}
正常监控日志

异常监控日志
