千家信息网

springboot如何实现一个简单的aop实例

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下springboot如何实现一个简单的aop实例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!简介AOP(Aspect-Oriented Programming:面
千家信息网最后更新 2026年11月01日springboot如何实现一个简单的aop实例

小编给大家分享一下springboot如何实现一个简单的aop实例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

简介

AOP(Aspect-Oriented Programming:面向切面编程)

aop能将一些繁琐、重复、无关业务的逻辑封装起来,在一个地方进行统一处理,常用于日志记录、事务管理、权限控制等,aop能在不改变原有代码逻辑的基础上对某个方法、某类方法、或者整个类进行无侵入式的加强,有效降低了代码耦合度,并且提高了项目扩展性;

ok废话说完,进入正题,如何实现一个aop

要实现aop,首先你要知道你拿aop来干啥,我们今天就以记录日志来说,因为这个最常用,一般对于重要的数据库操作,我们需要记录操作人、什么时间、做了什么,关于做了什么怎么实现我们后面细讲(要想知道做了什么,肯定得知道是哪个方法、并且哪些参数,这些属于进阶操作,我们先简单实现一个aop)

我们先new一个切面

@Aspect@Componentpublic class LogAspect {    @Pointcut("execution(* com.example.mydemos.controller..*(..))")    public void controllerMenthod() {    }    @Before("controllerPointcut()")    public void beforeExecute() {        System.out.println("before...");    }    @After("controllerPointcut()")    public void afterExecute() {        System.out.println("after...");    }}

关于注解

  • @Aspect:告诉spring这是一个切面;

  • @Component:将切面交由spring来管理;

  • @Pointcut:切入点,直白点就是指定你需要从哪个地方切入,再直白点就是你想增强的目标方法,这里需要了解下execution表达式,可以通过这里来指定你需要切入的方法,可以指定单个方法、整个类的所有方法、类的某些方法、整个包下所有类的所有方法等;

  • @Before:目标方法执行前需要做的事;

  • @After:目标方法执行后需要做的事

还有几个常用注解:

@Around(能自由的指定在目标方法执行前后做增强逻辑,需要手动调用ProceedingJoinPoint的proceed方法来执行目标方法,不调用则目标方法不会执行,如果目标方法有返回值,还需手动返回)

@AfterReturning(在目标方法正常执行完成后做增强,如果你需要获取方法返回值就用它)

@AfterThrowing(当目标方法执行过程中抛出异常时执行)

执行时机:
切入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After

来个测试controller
就是个平平无奇的普通controller

@RestControllerpublic class HiController {    @GetMapping("/hi")    public String sayHello() {        System.out.println("hi, good morning~");        return "hi bro ~";    }}

我这个controller是放在Pointcut对应com.example.mydemos.controller包下的,所以该包下的所有类的所有方法都会被增强

先假设后验证

按照上述demo
当我访问"/hi"时,会先执行@Before对应方法,输出"before…",再执行HiController 中的sayHello方法,输出"hi, good morning~",并且返回"hi bro ~",最后执行@After对应方法,输出"after…"

验证:
项目跑起来访问"/hi"

控制台

验证成功~


一个最基础的aop实现完毕,接下来搞点进阶操作

获取目标方法参数

再来个测试controller

@RestControllerpublic class HelloController {        @GetMapping("/hello/{title}/{content}")    public String sayHello(@PathVariable("title") String title, @PathVariable("content") String content) {        System.out.println(title + ":" + content);        return "hello ya~";    }}


现在我们有两个controller,顺便能测试下execution规则是否生效,我的规则是com.example.mydemos.controller下的所有方法都增强

HelloController的sayHello方法有两个参数title和content,看我们能不能拿到

获取目标方法参数需要用到JoinPoint,经测试,在@Before和@After中均能获取

@Before("controllerPointcut()")    public void beforeExecute(JoinPoint joinPoint) {        Object[] args = joinPoint.getArgs();        List list = Arrays.asList(args);        System.out.println("before中的目标方法参数");        list.forEach(System.out::println);        System.out.println("before...");    }    @After("controllerPointcut()")    public void afterExecute(JoinPoint joinPoint) {        Object[] args = joinPoint.getArgs();        List list = Arrays.asList(args);        System.out.println("after中的目标方法参数");        list.forEach(System.out::println);        System.out.println("after...");    }

joinPoint.getArgs()会返回一个object数组,这就是你的目标方法参数

测试


结果

获取目标方法名

所有符合规则的方法都会被增强,那我怎么知道当前执行的是哪个方法呢?

@Before("controllerPointcut()")    public void beforeExecute(JoinPoint joinPoint) {        String name = joinPoint.getSignature().getName();        System.out.println("before中的方法名:"+name);        System.out.println("before...");    }    @After("controllerPointcut()")    public void afterExecute(JoinPoint joinPoint) {        String name = joinPoint.getSignature().getName();        System.out.println("after中的方法名:"+name);        System.out.println("after...");    }

joinPoint.getSignature().getName()返回的就是方法名



获取目标方法返回值

这个就需要用到@Around或者@AfterReturning

一、@Around

@Around("controllerPointcut()")    public Object aruondExecute(ProceedingJoinPoint joinPoint) throws Throwable {        System.out.println("around before...");        String name = joinPoint.getSignature().getName();        Object o = joinPoint.proceed();        System.out.println("方法" + name + "的返回值是" + o);        System.out.println("around after...");        return o;    }

注意,如果用around,需手动调用ProceedingJoinPoint.proceed才能执行目标方法,并且如果目标方法有返回值,需要手动return

访问"/hi"


二、@AfterReturning

@AfterReturning(value = "controllerPointcut()", returning = "result")    public void AfterReturningExecute(JoinPoint joinPoint, Object result) {        System.out.println("AfterReturning...");        String name = joinPoint.getSignature().getName();        System.out.println("方法" + name + "的返回值是" + result);    }

用AfterReturning的话需要添加一个参数returning,用于接收返回值,且AfterReturning注解中的形参要和AfterReturningExecute中的一致,不然识别不到

访问"/hi"

看完了这篇文章,相信你对"springboot如何实现一个简单的aop实例"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

方法 目标 参数 就是 切面 手动 测试 注解 规则 逻辑 输出 验证 实例 直白 两个 代码 地方 基础 常用 日志 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重生之互联网科技帝国 科技和互联网公司 互联网的科技创新 互联网金融 金融科技 互联网未来科技 云电互联网科技 丰台科技园 互联网公司 互联网 科技馆 中国的互联网科技企业的崛起 受益于互联网科技的高速发展 开一家科技互联网公司需要多少钱 健康食品互联网创新科技园项目 想开互联网科技公司怎么样 张召忠谈中国互联网科技 下一代互联网重大应用科技园 世界互联网科技成果奖 银川新华互联网科技学校是国营吗 北京天晋互联网科技有限公司 安徽零酒互联网科技有限公司 亚光科技低轨卫星互联网 互联网通讯科技 善班互联网科技有限公司 互联网金融科技委员会 常德市电业局互联网科技部 金融科技与互联网金融相同和不同 互联网时代科技改变生活 注册互联网科技公司经营范围大全 互联网科技资金流入 济南小医互联网科技有限公司招聘 长沙渺峰互联网科技有限公司
0