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

AOP进阶-05.连接点

一.连接点 

JoinPoint有两个,要使用org,aspectj.lang

package com.gjw.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 目标:掌握AOP中的连接点技术
 *      所谓连接点,就是可以被AOP控制的方法,而在SpringAOP中,这个链接点又特指方法的执行
 * 在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等
 *      对于@Around通知,获取连接点信息只能使用 ProceedingJoinPoint
 *      对于其他四种通知,获取连接点信息只能使用JoinPoint,它是ProceedingJoinPoint的父类型
 */
@Slf4j
@Component
@Aspect
public class MyAspect8 {
    @Pointcut("execution(* com.gjw.service.impl.DeptServiceImpl.*(..))")
    public void pt(){}


    @Around("pt()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("MyAspect8 around before......");

        // 1.   获取 目标对象的类名
        String className = joinPoint.getTarget().getClass().getName();
        log.info("目标对象的类名:{}",className);

        // 2.   获取  目标对象的方法名
        String methodName = joinPoint.getSignature().getName();
        log.info("目标对象的方法名:{}",methodName);

        // 3.   获取  目标方法运行时传入的参数
        Object[] args = joinPoint.getArgs();
        log.info("目标方法运行时传入的参数:{}", Arrays.toString(args));

        // 4.   放行  目标方法执行
        Object result = joinPoint.proceed();

        // 5.   获取  目标方法运行后的返回值
        log.info("目标方法运行后的返回值:{}", result);

        log.info("MyAspect8 around after");
        return result;
    }
}

Test中的测试代码

package com.gjw.springbootaopquickstart;

import com.gjw.pojo.Dept;
import com.gjw.service.DeptService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootAopQuickstartApplicationTests {

    @Autowired
    private DeptService deptService;

    @Test
    void contextLoads() {
    }

    @Test
    public void testAopDelete() {
        deptService.deleteById(10);
    }

    @Test
    public void testAopList() {
        List<Dept> list = deptService.list();
        System.out.println(list);
    }

    @Test
    public void testAopGetById() {
        Dept dept = deptService.getById(1);
        System.out.println(dept);
    }

}

执行testAopList()方法,执行结果如下:

如果我们将result返回的结果改为null,则list方法(原始方法)就拿不到返回值了。返回null,就相当于原始方法执行完后,结果就丢了。因此要将result返回回去,设置通知方法的返回值类型为Object。 

 执行testAopDelete()方法,执行结果如下:

delete方法没有返回值。 

http://www.dtcms.com/a/38970.html

相关文章:

  • RK3588开发板本地部署DeepSeek-R1
  • uac bypass 相关资料
  • 计算机视觉(opencv-python)入门之常见图像预处理操作(待补充)
  • 【2025-02-26】基础算法:二分查找(二)
  • PS吸管工具
  • 给字符串加密解密
  • Go中slice和map引用传递误区
  • 内存泄漏问题分享
  • nginx 配置https
  • 怎样免费部署LLM通过python进行调用
  • [含文档+PPT+源码等]精品基于Python实现的居家健身系统的设计与实现
  • Linux | GRUB / bootloader 详解
  • 【Java项目】基于Spring Boot的论坛管理系统
  • 如何在 Unity3D 中将网页内容渲染为纹理
  • 缓存击穿、缓存穿透、缓存雪崩
  • 回归预测 | Matlab基于SSA-BiLSTM-Attention的数据多变量回归预测(多输入单输出)
  • 文献汇总|AI生成图像检测相关数据集汇总
  • 聚焦低空经济,峰飞航空飞行汽车开启未来出行新篇章
  • 学习笔记06——JVM调优
  • 【论文解读】Kimi开源《Muon is Scalable for LLM Training》
  • 蓝桥杯练习代码
  • 【Python爬虫(88)】当Python爬虫邂逅智能硬件:解锁数据新玩法
  • 【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)
  • 仅需三分钟,使用Vue3.x版本组件式风格实现一个消息提示组件!
  • 故障诊断 | Matlab实现基于双堆集stack模型的多特征分类预测/故障诊断
  • 【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT
  • 本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
  • Java虚拟机垃圾回收算法的优化与性能分析
  • 【Python爬虫(83)】探秘an网数据爬取:合法合规下的技术探索
  • 如何免费使用稳定的deepseek