自定义 aop
- AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。
Spring AOP 和 AspectJ AOP 有什么区别?
Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。
@interface Clc
@Target(value = {ElementType.TYPE, ElementType.METHOD})//使用位置(类,方法)
@Retention(RetentionPolicy.RUNTIME)//加载到jvm里运行
public @interface Clc {
}
解析clc注解使用
@Aspect//来定义一个切面
@Component
public class ClcAop {
/**
* 环绕通知来说,连接点的参数类型必须是ProceedingJoinPoint
* execution(<修饰符模式>? <返回类型模式> <方法名模式>(<参数模式>) <异常模式>?)
*/
@Around("execution(* com.itwong.demo.controller.demo.*(..))")
public Object auditAspect(ProceedingJoinPoint point) throws Throwable {
String targetName = point.getTarget().getClass().getName(); //获得执行方法的类名
String methodName = point.getSignature().getName(); //获得执行方法的方法名
Object[] args = point.getArgs(); //获取方法的参数
Object proceed = null;
System.out.println("1221212132");
try {
//@Before
System.out.println("【环绕前置通知】【" + methodName + "方法开始】");
//就是利用反射调用目标方法,即method.invoke(obj,args)
proceed = point.proceed(args);
//@AfterReturing
System.out.println("【环绕返回通知】【" + methodName + "方法返回,返回值" + proceed + "】");
} catch (Exception e) {
//@AfterThrowing
System.out.println("【环绕异常通知】【" + methodName + "】方法出现异常,异常信息:" + e);
//为了让外界能知道这个异常,这个一定要抛出
throw new RuntimeException(e);
} finally {
//@After
System.out.println("【环绕后置通知】【" + methodName + "】方法结束");
}
//反射调用后的返回值也须返回
return proceed;
}
}
测试自定义注解
- RequestBody和RequestHeader 要加上 否则ProceedingJoinPoint 获取不到入参
@Clc
@RequestMapping(value = "/add2", method = RequestMethod.GET)
@ResponseBody
public String add2(@RequestBody Map<String, Object> param, @RequestHeader Map<String, Object> header) {
System.out.println("---------------");
return "info";
}
Object[] args = point.getArgs(); //获取方法的参数 里面的参数
返回结果
1221212132 【环绕前置通知】【add2方法开始】
【环绕返回通知】【add2方法返回,返回值info】 【环绕后置通知】【add2】方法结束
标签:自定义,point,Spring,aop,System,AOP,println,AspectJ From: https://blog.51cto.com/u_15993308/6183973