Spring AOP

一、什么是Spring AOP

AOP(Aspect Oriented Programming):面向切面编程(也就是面向某一个方面的编程),它是一种思想,是对某一类事情的集中处理。

比如用户登录权限的校验,我们就需要判断用户登录的页面(方法),但是有了AOP之后,我们只需要配置以下,所有需要判断用户登录页面的方法就全部都可以实现用户登录验证了,就不再需要每个方法中都写相同的用户验证了。

除了登录判断以外,AOP还可以实现:

* 统一日志记录

* 统一方法执行时间统计

* 统一的返回格式设置

* 统一的异常处理

* 事务的开启和提交

AOP可以扩充多个对象的某个能力,也就是针对于OOP(Object Oriented Programming 面向对象编程)的补充。

二、Spring AOP的相关学习(三个部分)

Spring AOP学习主要分为3个部分:

* AOP的组成,相关概念

* Spring AOP的使用

* Spring AOP的实现原理

🍅 1、AOP的组成

* 切面(Aspect):定义的事件,比如用户登录校验;

* 切点(Pointcut):定义具体规则。比如用户的拦截规则,哪些 接口判断用户登录权限,哪些不判断;

* 通知(Advice):AOP执行的具体方法。比如获取用户登录信息,如果获取到说明已经登录,否则未登录;

通知分为:前置通知,后置通知,环绕通知,异常通知,返回通知

* 连接点(Join Poit):有可能触发切点的所有点,所有接口就是连接点。

🍅 2、Spring AOP使用

AOP使用步骤:

(1)添加Spring AOP依赖

(2)定义切面

(3)定义切点

(4)实现通知

🎈 2.1 添加AOP

在pom.xml中添加配置:

XML 复制代码
 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo
ot-starter-aop -->

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

🎈 2.2.定义切面和切点

java 复制代码
//先定义一个UserController 
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getuser")
    public String getUser(){
        System.out.println("do getUser");
        return "get user";
    }

    @RequestMapping("/deluser")
    public String delUser(){
        System.out.println("do delUser");
        return "del user";
    }
}

格式:@Pointcut("execution"(* controller类所在的位置.*(...))")

java 复制代码
@Aspect
@Component
public class UserAspect {

//    切点
//    只是一个点,不需要放置任何代码
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){}
}

🎈 2.3 实现通知 (UserAspect中实现)

java 复制代码
  @Before("pointcut()")
    public void doBefore(){
        System.out.println("指定了前置通知");
    }
 @After("pointcut()")
    public void doAfter(){
        System.out.println("执行了后置通知");
    }

添加一个环绕通知:环绕通知是在执行目标方法之前和之后执行的

java 复制代码
 @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知执行之前");
//        执行目标方法
        Object result = joinPoint.proceed();
        System.out.println("环绕通知执行之后");
        return result;
    }

三、Spring AOP的实现原理

AOP时构建在动态代理的基础上,因此Spring对AOP的支持局限于方法级别的拦截。

**动态代理:**是一种在运行时动态生成代理对象的技术。它是一种设计模式,用于在不修改原始对象的情况下,通过代理对象来间接访问原始对象,并在访问前后执行额外的操作。

两种动态代理:

1.JDK Proxy,代理对象必须实现接口,才能使用JDK Proxy

2.CGLIB,通过实现代理类的子类来实现动态代理,被final修饰的子类不能实现。
JDK 和 CGLIB 实现的区别:

  1. JDK 实现,要求被代理类必须实现接⼝,之后是通过 InvocationHandler 及 Proxy,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代 理接口实现的方式),只是该代理类是在运行期时,动态的织⼊统⼀的业务逻辑字节码来完 成。
  2. CGLIB 实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的⽣成代理类对象。
相关推荐
Lhappy嘻嘻11 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒12 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚14 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔72514 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
我命由我1234516 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑16 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ18 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案18 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
Csvn19 小时前
📊 SQL 入门 Day 2:排序与去重 — 让数据有序呈现
sql
猿与禅19 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式