1 AOP 概述
AOP 是什么:
AOP(Aspect Orient Programming)是一种设计思维,是软件设计畛域的面向切面编程。简略来说,就是在不批改源码的状况下,削减业务扩大性能的一种技术。
与 OOP 之间的区别,AOP 是在运行期、动静的植入性能或管制对象执行,而 OOP 次要对象是动态的。
原理剖析:
1) 如果指标对象 (被代理对象) 实现接口,则底层能够采纳 JDK 动静代理机制为指标对象创立代理对象(指标类和代理类会实现独特接口)。
2) 如果指标对象 (被代理对象) 没有实现接口,则底层能够采纳 CGLIB 代理机制为指标对象创立代理对象(默认创立的代理类会继承指标对象类型)。
Spring 中 AOP 相干术语剖析
- 指标类:咱们须要扩大性能业务的对象。
▪ 切面(aspect): 横切面对象, 个别为一个具体类对象(能够借助 @Aspect 申明)。
▪ 通 知 (Advice): 在 切 面 的 某 个 特 定 连 接 点 上 执 行 的 动 作 (扩 展 功 能),例 如
around,before,after 等。
▪ 连接点(joinpoint): 程序执行过程中某个特定的点,个别指向被拦挡到的指标办法。
▪ 切入点 (pointcut): 对多个连接点(Joinpoint) 一种定义, 个别能够了解为多个连接点的汇合。
2 Spring AOP 疾速实际
maven 配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter- aop</artifactId>
</dependency>
阐明:基于此依赖 spring 能够整合 AspectJ 框架疾速实现 AOP 的根本实现。AspectJ
是一个面向切面的框架,他定义了 AOP 的一些语法,有一个专门的字节码生成器来生成遵
守 java 标准的 class 文件。
创立切面类对象:
package com.cy.pj.common.aspect;
@Aspect
@Slf4j
@Component
public class SysLogAspect {@Pointcut("bean(sysUserServiceImpl)")
public void doLogPointCut() {}
@Around("doLogPointCut()")
public Object around(ProceedingJoinPoint jp)
throws Throwable{
try {log.info("start:{}"+System.currentTimeMillis());
Object result=jp.proceed();// 最终会调用指标办法
log.info("after:{}"+System.currentTimeMillis());
return result;
}catch(Throwable e) {log.error("after:{}",e.getMessage());
throw e;
}
}
}
@Aspect 注解用于标识或者形容 AOP 中的切面类型,基于切面类型构建的对象用于为指标对象进行性能扩大或控制目标对象的执行。
▪ @Pointcut 注解用于形容切面中的办法,并定义切面中的切入点(基于特定表达式的形式进行形容),在本案例中切入点表达式用的是 bean 表达式,这个表达式以 bean 结尾,bean 括号中的内容为一个 spring 治理的某个 bean 对象的名字
▪ @Around 注解用于形容切面中办法,这样的办法会被认为是一个盘绕告诉(外围业务办法执行之前和之后要执行的一个动作),@Aournd 注解外部 value 属性的值为
一个切入点表达式或者是切入点表达式的一个援用(这个援用为一个 @PointCut 注解形容的办法的办法名)。
▪ ProceedingJoinPoint 类为一个连接点类型,此类型的对象用于封装要执行的指标办法相干的一些信息。只能用于 @Around 注解形容的办法参数。