hi ,大家好,今天为大家带来String AOP相关的知识
文章目录
🐶1. AOP定义
AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理,旨在提高代码的模块化和复用性.
比如对登录功能的统一处理,没有AOP的时候到哪一个页面都得进行用户的登录判断,有了AOP,就可以集中在一个类里面进行处理,所有页面在加载之前先走这个登录功能,降低代码的耦合性
🐶2. AOP功能
AOP(面向切面编程)是一种编程范式,它通过将应用程序分解成核心业务和横切关注点,然后通过动态代理等技术,在横切关注点处插入特定的代码逻辑,完成一些通用的功能,如日志记录、性能监控、事务管理等。AOP的主要功能包括:
-
日志记录:通过在业务方法执行前后插入日志记录代码,记录请求的参数、响应结果等信息,以便于系统运行监控和错误排查。
-
权限控制:通过在业务方法执行前后插入权限验证代码,判断用户的角色、权限等信息,以确定是否有权限执行该方法。
-
缓存管理:通过在业务方法执行前后插入缓存管理代码,在缓存中查询是否有该数据,并将查询结果缓存到本地,以提高系统性能。
-
事务管理:通过在业务方法执行前后插入事务管理代码,确保业务操作的一致性和完整性,防止出现数据不一致或者中断导致的数据损失等不良后果。
-
异常处理:通过在业务方法执行前后插入异常处理代码,对异常情况进行处理,抛出自定义的异常信息,方便上层调用者进行处理。
Spring AOP和AOP的关系
AOP是一种思想,Spring AOP是一个框架,是AOP思想的实现
🐶3.Spring AOP相关概念
🥝3.1 AOP 组成
🥝3.2Spring AOP实现
🧊3.2.1添加Spring AOP框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
🧊3.2.2 定义切面
package com.example.demo.common;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//定义切面
@Aspect
@Component
public class UserAspect {
}
🧊3.2.3定义切点
🧊3.2.4定义通知
先来认识一下通知
1 前置通知(Before Advice):在目标方法执行前执行,可以在方法执行前进行一些准备工作。
2 后置通知(After Advice):在目标方法执行后执行,可以在方法执行后进行一些收尾工作。
3 返回通知(After Returning Advice):在目标方法执行并返回结果后执行,可以获取方法执行结果并进行一些操作。
4 异常通知(After Throwing Advice):在目标方法抛出异常时执行,可以对抛出的异常进行捕获和处理。
5 环绕通知(Around
Advice):在目标方法执行前后都可以执行,可以在方法执行前进行一些准备工作,在方法执行后进行一些收尾工作,并可以控制方法的执行流程。
通知定义的是被拦截的⽅法具体要执⾏的业务
我们拦截的是UserController类里面的所有方法,所以在执行该类的目标方法时,就会执行通知
我们没有针对ArticleController进行拦截,
所以没有执行通知
//环绕通知
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知执行之前");
Object obj= joinPoint.proceed();
System.out.println("环绕通知执行之后");
return obj;
}
可以看到先前置通知和后置通知在环绕通知之间执行,环绕通知是在最前面和最后面执行,执行目标方法就是 Object obj= joinPoint.proceed()这一句对应的UserConttroller类里面的方法,最终返回给框架执行👀
🐶3.3Spring AOP实现原理
Spring AOP是构建在动态代理上的.所以Spring 对于AOP的支持局限于方法级别的拦截
什么是动态代理呢?
是一种编程技术,可以在运行时动态生成代理类,来代替原始对象进行某些操作。动态代理可以用于很多场景,例如日志记录、性能统计、安全控制、事务管理等。
比如李华和李明都想喝蜜雪,那么就需要出去买,这样就得出去俩两次,很麻烦,所以可以一起点外卖,让外卖小哥送两杯,那么这个外卖员就相当于动态代理🐶
🐷Spring 动态代理组成:
1.JDK Proxy(代理对象必须实现接口,才能实现动态代理)
JDK Proxy的实现原理就是利用Java反射机制,动态生成一个代理类,代理类实现需要被代理的接口,并将代理对象的方法调用转发给实现
2.CGLIB(实现代理类的子类实现动态代理),由于由于实现子类需要继承,而一个类想要被继承不能被final修饰,所以,CGLIB的限制条件:被final修饰的类不能被代理
JDK Proxy VS CGLIB
1.出身不同
JDK Proxy来源于Java,CGLIB来源于第三方
2.实现方式不同:
JDK Proxy是通过Java反射机制在运行时动态生成代理类,而CGLIB则是通过继承被代理类来创建代理类。
3.性能不同:JDK Proxy比CGLIB要快,因为JDK Proxy是直接使用Java反射机制调用被代理对象的方法,而CGLIB使用的是动态生成的代理类来调用被代理对象的方法,因此会涉及到类加载和方法调用,相对来说比较耗时。
今天的讲解就到这里,下期再见!