博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:MySQL数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
1. AOP概述
AOP就是⾯向切⾯编程的简称,它是⼀种思想,是对某⼀类事情的集中处理.
什么是SpringAOP?
AOP是⼀种思想,它的实现⽅法有很多,有SpringAOP,也有AspectJ、CGLIB等
Spring AOP是其中的一种实现方式
AOP 的作⽤:在程序运⾏期间在不修改源代码的基础上对已有⽅法进⾏增强
AOP就可以做到在不改动这些原始⽅法的基础上,针对特定的⽅法进⾏功能的增强
1.1 AOP有哪些可用的实现?
基于Java的主要AOP实现有:
- AspectJ
- Spring AOP
- JBoss AOP
2. Spring AOP程序入门
2.1 配置AOP依赖
在pom.xml⽂件中添加配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.2 编写AOP程序
@Component
@Slf4j
@Aspect
public class TimeRecordAspect {
@Around("execution(* com.bite.book.controller.*.*(..))")
public Object timeRecord(ProceedingJoinPoint joinPoint) throws Throwable {
//记录方法耗时
//开始时间
long start = System.currentTimeMillis();
//执行原始方法
Object result = joinPoint.proceed();
//记录耗时时间
log.info(joinPoint.getSignature()+"耗时" +(System.currentTimeMillis()-start)+"ms");
return result;
}
}
执行查看日志
对程序进⾏简单的讲解:
1. @Aspect:标识这是⼀个切⾯类
2. @Around: 环绕通知,在⽬标⽅法的前后都会被执⾏.后⾯的表达式表⽰对哪些⽅法进⾏增强.
3. joinPoint.proceed()让原始⽅法执⾏
整个代码划分为三部分 :
3. Spring AOP详解
3.1 基础概念
切点
连接点
通知
切⾯: 切⾯(Aspect)=切点(Pointcut)+通知(Advice)
通过切⾯就能够描述当前AOP程序需要针对于哪些⽅法,在什么时候执⾏什么样的操作
切⾯既包含了通知逻辑的定义,也包括了连接点的定义
切⾯所在的类,我们⼀般称为切⾯类
3.2 通知类型
@Around:环绕通知,此注解标注的通知⽅法在⽬标⽅法前,后都被执⾏
@Before:前置通知,此注解标注的通知⽅法在⽬标⽅法前被执⾏
@After:后置通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,⽆论是否有异常都会执⾏
@AfterReturning: 返回后通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,有异常不会执⾏
@AfterThrowing:异常后通知,此注解标注的通知⽅法发⽣异常后执⾏
3.3 @PointCut
Spring提供了@PointCut注解,把公共的切点表达式提取出来, 需要⽤到时引⽤该切⼊点表达式即可
1.同一个切面类内
@Component
@Slf4j
@Aspect
public class MyAspectDemo {
@Pointcut("execution(* com.lxy.demo.controller.*.*(..))")
public void pt(){};
@Before("pt()")
public void doBefore(JoinPoint joinPoint){
log.info(joinPoint.getSignature().toShortString());
log.info("执行before方法...");}
@After("pt()")
public void doAfter(){ log.info("执行after方法...");}
}
2.其他切面类
当其他切⾯类也要使⽤当前切点定义时,引⽤⽅式为: 全限定类名.⽅法名()
3.4 切⾯优先级@Order
Spring 给我们提供了⼀个新的注解, 来控制这些切⾯通知的执⾏顺序: @Order
@Order 控制切⾯的优先级,先执⾏优先级较⾼的切⾯,再执⾏优先级较低的切⾯,最终执⾏⽬标⽅法
@Order注解标识的切⾯类,执⾏顺序如下:
• @Before 通知:数字越⼩先执⾏
• @After 通知:数字越⼤先执⾏
3.5 切点表达式
1. execution表达式
execution() 是最常⽤的切点表达式,⽤来匹配⽅法
切点表达式⽰例
2. @annotation
实现步骤:
1. 编写⾃定义注解
2. 使⽤ @annotation 表达式来描述切点
3. 在连接点的⽅法上添加⾃定义注解
准备代码:
⾃定义注解 @CostTime
1. @Target
@Target标识了 Annotation 所修饰的对象范围, 即该注解可以⽤在什么地⽅.
ElementType.TYPE: ⽤于描述类、接⼝(包括注解类型) 或enum声明
ElementType.METHOD: 描述⽅法
ElementType.PARAMETER: 描述参数
ElementType.TYPE_USE: 可以标注任意类型
2. @Retention
@Retention指Annotation被保留的时间⻓短, 标明注解的⽣命周期
3. 切⾯类
使⽤ @annotation 切点表达式定义切点, 只对 @CostTime⽣效
4. 添加⾃定义注解
在TestController中的t1()和UserController中的u2()这两个⽅法上添加⾃定义注解 @CostTime , 其
他⽅法不添加
Spring AOP的实现⽅式
1. 基于注解 @Aspect
2. 基于⾃定义注解
3. 基于SpringAPI(通过xml配置的⽅式)
4. 基于代理来实现(更加久远的⼀种实现⽅式)
标签:Spring,AOP,切点,通知,注解,表达式 From: https://blog.csdn.net/jj666mhhh/article/details/143811891