AOP
AOP: Spring的第二大核心: 面向切面编程, 把方法层面的逻辑代码进行分离, 让方法层面逻辑代码解耦, 不改变目标方法前提下, 动态增强目标方法
IOC: Spring的第一大核心: 提供了IOC容器, 提供了BeanFactory, 把项目中的对象交给Spring管理, 降低对象与对象之间的耦合度
AOP: 面向切面编程, 对OOP的延续, 考虑的是方法层面的问题
OOP: 面向对象编程, 考虑对象层面,
作用:
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,
AOP: 横向扩展
OOP: 纵向扩展:
AOP的使用场景
-
日志记录
-
权限控制
-
缓存
-
性能监控
-
事务控制
AOP核心概念
连接点: JoinPoint: 目标类的所有的方法都是连接点, 一个连接点对象就是一个方法对象
切入点: Pointcut: 对目标类哪些方法增强, 被增强的方法称为切入点, 是一个字符串表达式,
通知类,增强类: advice, 包含增强方法的类
目标对象: target 被代理的目标对象
**Weaving(织rget(目标):入)😗*是指把增强应用到目标对象来创建的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
**Aspect(切面)😗*是切入点和通知(引介)的结合
代理对象: proxy
增强,通知的类型 面试
- 前置增强, 在目标方法之前执行
- 后置增强: 在目标方法正常执行之后执行
- 异常增强: 在目标方法产生异常的时候,执行
- 最终增强: 不管目标方法是否产生异常,都要执行的
- 环绕增强:(一个顶上面四个)
AOP代码实现
基于第三方的aop框架: AspectJ( AOP框架), 对通知类没有任何要求
基于xml配置
-
导入依赖: spring-aop, spring-aspect依赖
<!--aop相关依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>
-
编写目标类
SpringAOP底层实现技术:
如果目标类实现接口, 底层基于jdk动态代理,如果目标类没有实现接口, 底层基于cglib的动态代理
-
编写通知类/增强类
package com.fs.aop.advice; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import java.util.Arrays; /** * @author suke * @version 1.0 * @title LogAdvice * @description 日志增强类 * 基于AspectJ框架AOP实现, 通知类/增强类不需要实现任何接口,不需要继承某个类, 方法随便定义 * @create 2024/4/28 15:49 */ @Slf4j public class LogAdvice { //前置增强 //获取目标方法信息 JoinPoint(连接点) public void beforeAdvice(JoinPoint jp){ Object target = jp.getTarget(); //目标对象 String methodName = jp.getSignature().getName();//得到目标方法名 //获取调用目标方法传递的参数 Object[] args = jp.getArgs(); //日志打印, 使用log在控制台输出,实际开发, 把日志信息保存到数据库 log.info(target.getClass().getName()+"类的"+methodName+"方法开始执行,传递的参数:"+ Arrays.asList(args)); } }
-
在spring的配置文件中,使用aop的标签进行目标方法与增强方法的织入