首页 > 其他分享 >自定义aop

自定义aop

时间:2023-04-11 23:32:18浏览次数:44  
标签:自定义 point Spring aop System AOP println AspectJ

自定义 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(); //获取方法的参数 里面的参数 Snipaste_2021-06-07_16-25-07

返回结果

1221212132 【环绕前置通知】【add2方法开始】

【环绕返回通知】【add2方法返回,返回值info】 【环绕后置通知】【add2】方法结束

标签:自定义,point,Spring,aop,System,AOP,println,AspectJ
From: https://blog.51cto.com/u_15993308/6183973

相关文章

  • Winform-自定义按钮_播放图标
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing.Drawing2D;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Management.Inst......
  • 实现自定义接口以及嵌套类的应用
    interfaceCityNumber{//定义两个接口intgetNumber();}interfaceDestination{StringgetName();}publicclassMain{publicclassCitysimplementsCityNumber{//嵌套的内部类1privateintid=518;@OverridepublicintgetNum......
  • 学习笔记396—自定义Docker镜像推送到Docker Hub实战
    自定义Docker镜像推送到DockerHub实战云原生探索的必经之路—容器化,而容器化目前最主流的技术莫过于Docker了,因为之前也大量的输出过Docker相关的技术博客,如果感兴趣的话可以直接访问专栏:​​《探索云原生》​​,按需学习哦。这篇文章还是从Docker入手,从0开始讲述下如何将自己的D......
  • 自定义SpringBoot Starter
    1.Starter加载原理Springboot通过SpringBootApplication注解启动项目,springboot启动的时候,会将项目中所有声明为bean对象的实例加载到IOC容器。除此之外也会将starter里的bean信息加载到ioc容器,从而做到0配置,开箱即用。1.1加载starter:Springboot项目启动时,Springboot通过@Spri......
  • 自定义指令之光标定位到输入框
    下面是一个自定义指令的例子,当一个input元素被Vue插入到DOM中后,它会被自动聚焦。解决方案:在input标签里增加ref属性,然后在exportdefault中增加构子函数mounted(挂载完成),写入以下代码,表示页面渲染完成后光标定位输入框。mounted(){    this.$nextTick(()=......
  • 自定义结果类
    自定义结果类参考:https://www.jianshu.com/p/398bf406f8e6参考:https://blog.csdn.net/zhang150114/article/details/90477002参考:https://zhuanlan.zhihu.com/p/414255238参考:https://blog.csdn.net/dedede001/article/details/128267515......
  • 58、K8S-监控机制-Prometheus-自定义metrics
    Kubernetes学习目录1、安装python环境1.1、下载python软件wgethttps://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz1.2、安装依赖包yuminstallgccgcc-c++glibc-develglibczlib-develzlibopenssl-developensslsqlite-develreadline-develbzip2-devel......
  • Oracle自定义splitstr
     CREATEORREPLACEFUNCTIONSPLITSTR(P_STRINGINVARCHAR2,P_DELIMITERINVARCHAR2)RETURNSTR_SPLITPIPELINEDASV_LENGTHNUMBER:=LENGTH(P_STRING);V_STARTNUMBER:=1;V_INDEXNUMBER;BEGINWHILE......
  • AOP底层原理-Cglib动态代理
      publicclassApp{publicstaticvoidmain(String[]args){UserServiceuserService=UserServiceCglibProxy.createUserServiceCglibProxy(UserServiceImpl.class);userService.save();}}publicclassUserServiceCglibProxy{......
  • 小程序自定义省市二级联动
    conststr=[{id:"110000",name:"北京市",city:[{id:"110100",name:"北京市",area:[{id:"110101",name:"东城区"},{id:"110102",name:"西城区"},{id:"110105",name:"朝阳区"},{id:"......