当前位置: 首页 > 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方法没有返回值。 

相关文章:

  • 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》
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世
  • 特色茶酒、非遗挂面……六安皋品入沪赴“五五购物节”
  • 短剧剧组在贵州拍戏突遇极端天气,演员背部、手臂被冰雹砸伤
  • 消费者在天猫一旗舰店换手机电池疑遭套路致手机损坏,平台已介入
  • 创历史同期新高!“五一”假期全国快递揽投超48亿件
  • 谢承祥已任自然资源部总工程师