SpringAOP简单案例

article/2025/9/14 8:24:20
简介
  • 本文是一个老师在学校给学生上课的简单案例,介绍了AOP的五个通知的使用,以及通知的执行顺序。通过自定义注解来充当切入点,获取注解的类型分别对不同的老师做对应的业务处理。
  • 代码中的消息响应体(Result)大家可以自定义类型。

一、AOP的五大通知

前置通知:Before
环绕通知:Around
后置通知:After
后置返回通知:AfterReturning
后置异常通知:AfterThrowing

执行顺序如下图所示:
在这里插入图片描述

二、AOP的使用方式

1.创建一个课题实体对象

package com.cloud.industryapi.test;import lombok.Data;/*** 课题实体* @date 2022/3/25 16:26*/
@Data
public class ArticleEntity {/*** PK*/private Integer id;/*** 课题*/private String title;/*** 内容*/private String content;}

2.定义一个切入点,这里以自定义注解的方式实现

package com.cloud.industryapi.test;import java.lang.annotation.*;/*** 切点标识* @author * @date 2022/3/25 13:09*/
@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PointcutId {String type() default "";
}

3.声明要织入的切面

package com.cloud.industryapi.test;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** 切面*/
@Slf4j
@Aspect
@Component
public class ArticleAspect {/*** 定义切入点*/@Pointcut("@annotation(com.cloud.industryapi.test.PointcutId)")public void pointcut(){}/*** 环绕通知* @param joinPoint* @param id* @return* @throws Throwable*/@Around("pointcut() && @annotation(id)")public Object around(ProceedingJoinPoint joinPoint, PointcutId id) throws Throwable {log.info("-------------around start-------------");Object[] objects = joinPoint.getArgs();switch (id.type()){case "language":ArticleEntity language = (ArticleEntity) objects[0];log.info("-------------语文老师课前备课,课题:{}-------------",language.getTitle());break;case "mathematics":log.info("-------------数学老师课前备课-------------");break;default:throw new RuntimeException("类型非法");}//joinPoint.proceed()Object s = joinPoint.proceed();log.info("-------------叮铃铃铃铃...放学了-------------");log.info("-------------around end-------------");return s;}/*** 前置通知* @param joinPoint* @param id*/@Before("pointcut()  && @annotation(id)")public void before(JoinPoint joinPoint,PointcutId id){log.info("-------------before start-------------");log.info("-------------学生进入教室,准备上课-------------");log.info("-------------before end-------------");}/*** 后置通知* @param joinPoint* @param id*/@After("pointcut() && @annotation(id)")public void after(JoinPoint joinPoint,PointcutId id){log.info("-------------after start-------------");log.info("-------------学校广播:老师们,同学们,中午好,今天学校食堂免费为你们准备了烧鸡,人手一鸡-------------");log.info("-------------after end-------------");}/*** 后置返回通知* @param joinPoint* @param id*/@AfterReturning("pointcut() && @annotation(id)")public void afterReturn(JoinPoint joinPoint, PointcutId id){log.info("-------------AfterReturning-------------");log.info("-------------老师们同学们拿着烧鸡回家了-------------");log.info("-------------学校关闭了大门-------------");log.info("-------------AfterReturning-------------");}/*** 后置异常通知* @param joinPoint* @param id*/@AfterThrowing("pointcut() && @annotation(id)")public void afterThrow(JoinPoint joinPoint,PointcutId id){log.info("-------------AfterThrowing-------------");log.info("-------------完蛋,小明同学迷路了。。。-------------");log.info("-------------AfterThrowing-------------");}}
  • 注 意 : P r o c e e d i n g J o i n P o i n t 的 p r o c e e d ( ) 方 法 相 当 于 前 置 通 知 和 后 置 通 知 的 分 水 岭 。 \color{#FF0000}{注意:ProceedingJoinPoint的proceed()方法相当于前置通知和后置通知的分水岭。} ProceedingJoinPointproceed()
  • 说 明 : P r o c e e d i n g J o i n P o i n t 的 p r o c e e d ( ) 方 法 在 执 行 前 用 来 做 一 些 , 例 如 : 读 取 日 志 , 然 后 执 行 目 标 方 法 。 P r o c e e d i n g J o i n P o i n t 的 p r o c e e d ( ) 方 法 执 行 后 , 用 来 做 一 些 , 例 如 : 写 入 日 志 \color{#0000FF}{说明:ProceedingJoinPoint的proceed()方法在执行前用来做一些,例如:读取日志,然后执行目标方法。ProceedingJoinPoint的proceed()方法执行后,用来做一些,例如:写入日志} ProceedingJoinPointproceed()ProceedingJoinPointproceed()

4.编写控制器

package com.cloud.industryapi.test;import com.cloud.common.kit.Result;
import com.cloud.common.page.FrontPagination;
import com.cloud.industry.dto.ExclusiveJumpConfigDto;
import com.cloud.industry.facede.ExclusiveJumpConfigFacede;
import com.cloud.industry.qo.ExclusiveJumpConfigQo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 文章 - 控制器*/
@Slf4j
@RestController
@RequestMapping("/aop/test")
public class ArticleController {/*** 后置异常通知*/@PointcutId@RequestMapping("/afterThrow")public void afterThrow(){log.info("-------------------进入了目标方法-------------------");System.out.println(2/0);}/*** 语文课** @param ae* @return*/@PointcutId(type = "language")@PostMapping("/language")public Result language(@RequestBody ArticleEntity ae) {log.info("-------------目标方法开始执行-------------");log.info("-------------语文老师进入教室,开始讲课《"+ae.getTitle()+"》-------------");System.out.printf("%s","深蓝的天空中挂着一轮金黄的圆月,下面是海边的沙地,都种着一望无际的碧绿的西瓜。\n" +"其间有一个十一二岁的少年,项带银圈,手捏一柄钢叉,向一匹猹尽力的刺去。\n" +"那猹却将身一扭,反从他的胯下逃走了。\n");log.info("-------------目标方法结束执行-------------");return Result.success("执行结束");}/*** 数学课** @param ae* @return*/@PointcutId(type = "mathematics")@PostMapping("/mathematics")public Result mathematics(@RequestBody ArticleEntity ae) {log.info("-------------目标方法开始执行-------------");log.info("-------------数学老师进入教室-------------");log.info("-------------“同学们,今天这节数学课,由我代上”-------------");log.info("-------------“起立”-------------");log.info("-------------”体~育~老~师~好~~“-------------");log.info("-------------目标方法结束执行-------------");return Result.success("执行结束");}
}

5.请求控制器
在这里插入图片描述
最后是请求的响应
在这里插入图片描述
完成


http://chatgpt.dhexx.cn/article/H4hfKGgB.shtml

相关文章

springAOP面试题

1.什么是SpringAop? 一般称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复…

SpringAOP复习

作业1 目录 作业1一.单选题二.填空题三.判断题 一.单选题 1、以下不属于ProxyFactoryBean类中的常用可配置属性的是()。 A、target B、proxyInterfaces C、targetClass D、interceptorNames 答案:C ProxyFactoryBean 是FactoryBean 接口的…

04、SpringAOP详解

1、Spring AOP简介 1、什么是AOP 1、定义阐述 AOP的全称是 Aspect Oriented Programming,是面向切面编程的技术,把一个个的横切关注点放到某个模块中去,称之为切面。那么每一个的切面都能影响业务的某一种功能,切面的目的就是功…

SpringAop之joinPoint讲解

一、学习背景 摸鱼的时候继续复刻demo,没错,同之前一篇文章,在写aop时又发现自己对aop只停留在面试阶段,甚至还不如,完全不会实践,所以在此记录复刻aop用到的的一些且自己已经遗忘的知识。 那么复刻的一个…

SpringAOP详细配置与使用

目录 SpringAOP简介 AOP概念 Spring AOP简单流程图 Spring AOP之Annotation 前置通知(Before advice) 返回后通知(After reurning advice) 抛出异常后通知(After throwing advice) 后置通知(After (finally) advice) 环绕通知(Around advice) 引入(Introduction) Sp…

SpringAOP的注解形式

铁子们,快扫码关注啦!或 wx搜索:“聊5毛钱的java”,关注可领取博主的Java学习视频资料,保证都是干货 上一篇讲了配置文件形式的SpringAOP:Spring中的AOP以及切入点表达式和各种通知 本篇继续看一下注解形…

Spring AOP超详细解析

AOP - 面向切面编程(Aspect Oriented Programming) Spring早期版本的核心功能:管理对象生命周期与对象分配。 即Bean本身的管理创建,以及它整个生命周期里跟其他对象相互之间引用装配 为了更好的实现管理和装配,一个…

Spring学习:AOP概述

一、AOP概念 AOP是指面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干…

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。 Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC…

图文详解Spring AOP,你学会了吗?

如果说 IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心,需要重点掌握mikechen 本篇主要会详解以下六点: 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念Spring AOP 通知分类S…

Spring AOP全面详解(超级详细)

如果说IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心mikechen AOP的定义 AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP&…

mysql执行SQL脚本

方法一 【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】 示例&#xff1a; 如果mysql配了全局变量&#xff0c;就不需要到Mysql的bin目录下执行&#xff0c;可以在任何地方使用用户名、密码、指定数据库等参数值与参数名不需要隔空格 不…

SpringBoot 实现SQL脚本自动执行

SpringBoot 实现配置SQL脚本自动执行 一. 背景 我们可能遇到过这种情况: 在公网开发时, 新增数据表非常容易, 直接登录到对应服务器的mysql / 使用Navicat访问mysql服务器. 然后去执行sql语句或脚本即可在内网开发时, 由于都在一个网段, 所以操作也比较方便但是在公网开发, 部…

flink-sql-client提交sql脚本文件

标题: flink-sql-client提交sql脚本文件 日期: 2021-10-22 22:11:34 标签: [flink,sql-client] 分类: flink 我们知道&#xff0c;sql-client.sh可以提供给我们一个sql交互界面&#xff0c;让我们没执行一个sql&#xff0c;就可以看到执行结果&#xff0c;也可以交互式查询表的…

如何在mysql中执行sql脚本文件

一、sql脚本文件 简介 xxxx.sql这种文件被称为sql脚本文件。sql脚本文件中编写了大量的sql语句。我们执行sql脚本文件的时候&#xff0c;该文件中所有的sql语句会全部执行&#xff01;批量的执行SQL语句&#xff0c;可以使用sql脚本文件。 上面这个vip.sql就是sql脚本文件&am…

使用sql脚本创建数据库表

准备脚本语句&#xff1a; CREATE TABLE test (title varchar(100) DEFAULT NULL,author varchar(10) DEFAULT NULL,digest varchar(255) DEFAULT NULL,content text,content_source_url varchar(500) DEFAULT NULL,thumb_media_id varchar(255) DEFAULT NULL,need_open_comme…

PowerDesigner生成Sql脚本

点击工具栏上的“Database”&#xff0c;选择“Change Current DBMS”进行修改导出脚本类型&#xff0c;可以选择mysql、sql server/ oracle 、db2等主流的数据库。 在DBMS中点击下拉菜单&#xff0c;选择要导出的数据库脚本&#xff0c;对名字进行自定义&#xff0c;点击确定即…

PowerDesigner导入sql脚本

一个好的数据库建模,不但可以让人直观的理解模型,充分的利用数据库技术,优化数据库的设计,而且还可以让新员工快速的熟悉数据库表结构与业务之间的关系.无奈的是随着开发过程中,数据库表结构字段的增删以及关联关系的变动给数据库模型带来维护上的巨大工作量.现为了维护上的简单…

dbeaver导入sql脚本

新建数据库 执行脚本 选择脚本文件 选择mysql 然后按确定就行了

springboot + mybatis启动时执行sql脚本

目录 1. 创建数据版本表&#xff0c;结构如下&#xff1a; 2. 创建HdVersion对象 3. 创建执行sql的dao 4. 创建dao对应的xml 5.创建sql执行器&#xff0c;实现ApplicationRunner 6. 结语 背景&#xff1a;项目开发或发布阶段修改表结构&#xff0c;项目更新时需要手动执行脚…