1、概念
Spring核心特征中除了IoC控制反转、DI依赖注入,还有一个核心就是强大的面向切面编程AOP(Aspect Oriented Programming)的实现。
实现了横切关注的模块化(将功能性代码与核心代码进行分离开来),避免代码缠绕,削除代码分散。
2、应用场景
日志与跟踪、事务管理、安全、缓存、错误处理.........等
3、核心概念
连接点:程序执行中的一个点,例如方法的调用或异常的抛出
切入点:选择一个或者多个连接点的表达式
Advice:在选择的每个连接点执行的代码
切面:一个囊括了连接点与Advice的模块
编制:将切面与主要代码进行结合的技术
4、切入点表达式:
4.1、常规表达式
通配符:* -匹配一次(包括返回值类型,包,类,方法,参数)
.. -匹配0次或多次(参数或包)
4.2、注解表达式
任何名称使用send开头的void方法,且添加了@RolesAllowed注解
5、通知
前置通知(@Before):在目标方法执行之前进行的操作(注意:如果通知抛出异常,则目标方法不会被调用)
返回后通知(@AfterReturning):在目标方法执行成功并获取到返回值之后执行
异常通知(@AfterThrowing):在目标方法抛出异常时执行
后置通知(@After):在目标方法执行完成之后执行(注意:无论目标方法是否抛出异常都会执行)
环绕通知(@Around):在目标方法执行之前和执行之后都进行操作
6、操作步骤
6.1、添加依赖
<dependencies>
<!--添加aop依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
6.2、创建切面类
@Component
@Aspect//切面:由切点和通知组成
public class AspectD {
//切点表达式: *表示1个 ..表示多个 *依次代表方法返回值,类名,方法名,(..)是参数列表
@Pointcut("execution(* cn.tedu.service.*.*(..))")
public void pointcut(){} //该方法主要作用就是承载@Pointcut
@Before("pointcut()")//前置通知,在每一个方法开始之前被调用
public void beforeMethod(JoinPoint joinPoint){
System.out.println("我是前置通知");
}
@After("pointcut()")//后置通知,在每一个方法结束后被调用
public void afterMethod(JoinPoint joinPoint){
System.out.println("我是后置通知");
}
@Around("pointcut()")//环绕通知,方法执行前后都被调用,必须有返回值
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {}
6.3、测试
@Service
public class ControllerImpl {
public void add(){
for (int i = 0; i < 100; i++) {
System.out.print("~");
}
}
}