当前位置: 首页 > article >正文

Spring的AOP

SpringBoot提供的AOP

@Before 前置通知:在方法执行前执行

@AfterReturning 返回通知 :在方法正常结束后执行

@AfterThrowing 异常通知:在方法抛出异常后执行

@After 最终通知:在方法执行后,不管是否有异常执行

@Around 环绕通知:环绕通知方法可以包含上面四种通知方法,功能最全面

SpringBoot自定义AOP步骤

  1. 定义切面Aspect

  2. 定义切点Pointcut

  3. 添加通知Advice

  4. 连接点Joinpoint 加强


@Component
@Aspect
public class CustomAspect {

    @Pointcut("execution(* com.xuyuan.service..*(..))")
    public void point() {
    }

    @Pointcut("@annotation(com.xuyuan.spring.aop.AfterResponse)")
    public void point1() {
    }


    @Before("point()")
    public void before(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Parameter[] parameters = signature.getMethod().getParameters();
        if (parameters.length < 2) ;
        System.out.println("before");
    }

    @After("point1()")
    public void after(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Parameter[] parameters = signature.getMethod().getParameters();
        if (parameters.length < 2) ;
        System.out.println("after");
    }
}

AspectJ 和 Spring AOP 的区别

目标不同:
SpringAOP是spring支持的面向切面AOP编程的一个工具。 
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
织入方式不同:
AspectJ 使用了三种不同类型的织入方式:
Compile-time weaving:编译期织入。编译器将切面和应用的源代码编译在一个字节码文件中。
Post-compile weaving:编译后织入。也称为二进制织入。将已有的字节码文件与切面编制在一起。
Load-time weaving:加载时织入。与编译后织入一样,只是织入时间会推迟到类加载到jvm时。

SpringAOP使用运行时织入
连接点不同:
springAOP 只支持方法执行连接点,而ASpectJ 还支持 方法调用,构造方法调用,属性引用,静态初始化、其他切面的通知等 作为连接点。 功能相当强大。
性能不同:
编译期织入要比运行期织入快很多。因此aspectJ 的运行速度要快于springAOP、

http://www.kler.cn/a/574278.html

相关文章:

  • 线上图片验证码性能优化base64编码
  • 数据结构与算法 计算机组成 八股
  • Ollama+Deepseek-R1+Continue本地集成VScode
  • 什么是全栈?
  • 基于海思soc的智能产品开发(芯片sdk和linux开发关系)
  • Linux安装Redis以及Redis三种启动方式
  • 深入解析 supervision 库:功能、用法与应用案例
  • 基于HAproxy搭建负载均衡
  • 前缀和的利用 前缀和的扩展问题
  • 如何用HTML5 Canvas实现电子签名功能✍️
  • P8707 [蓝桥杯 2020 省 AB1] 走方格
  • 【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
  • 鸿蒙Android4个脚有脚线
  • 道可云人工智能每日资讯|亚马逊云业务部门成立智能体人工智能团队
  • Unity3D WebGL内存优化与缓存管理
  • 使用jcodec库,访问网络视频提取封面图片上传至oss
  • [BD青训项目]介绍
  • vue3中子组件获取父组件的name,父组件不做修改动作
  • 算法探秘:盛最多水的容器问题
  • Oracle数据导入导出小工具(主要用于导入导出小批量含大字段的数据)