目录
- 1、AOP
- 1.1、AOP 的组成
- 1.2、AOP 的应用场景
- 2、Spring AOP 的实现
- 2.1、添加框架实现
- 2.2、定义切面和切点
- 2.3、定义相关通知
1、AOP
AOP(Aspect Oriented Programming):面向切面编程,是一种思想,是对某一类事情的集中处理。而 Spring AOP 是一个框架,提供了对 AOP 的实现。
1.1、AOP 的组成
以用户登录验证为例:
- 切面(Aspect):包含切点和通知,可以理解为 spring 中定义一个类,来组织一个横切一刀的逻辑。
- 连接点(Join Point):可以增强的一个范围。
- 切点(PointCut):规定匹配的条件,要增强的是哪些方法,即筛选方法。
- 通知(Advice):定义 AOP 统一增强的时机(方法执行前、执行后、抛异常等)。
1.2、AOP 的应用场景
对于功能统一,且使用的地方较多的功能,可以考虑 AOP 来统一处理。除了统一的用户登录判断之外,AOP还可以实现:
- 统一日志记录
- 统一方法执行时间统计
- 统一的返回格式设置
- 统一的异常处理
- 事务的开启和提交
2、Spring AOP 的实现
2.1、添加框架实现
在 pom.xml 中添加如下配置:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2.2、定义切面和切点
- @Aspect + @Component:定义一个切面,由于 @Aspect 是 aspectj 下的注解,因此需要另外使用 @Component 注解来将该类注册到容器中。
- @PointCut:定义一个切点,切点表达式由切点函数组成,其中 execution() 是最常用的切点函数,用来匹配方法,语法为 execution(<修饰符><返回类型><包.类.方法(参数)><异常>),修饰符和异常可以省略。
- 其中 pointcut() 方法是空方法,不需要有方法体,作用是“标识”,标识下面的通知方法具体指的是哪个切点(因为切点可以有多个)。
2.3、定义相关通知
通知定义的是被拦截的方法具体要执行的业务。Spring AOP 可在方法上使用以下注解,从而将方法设置为通知方法,在满足条件后会通知该方法调用。
- 前置通知使用 @Before:通知方法会在目标方法调用之前执行。
- 后置通知使用 @After:通知方法会在目标方法调用之后执行。
- 返回之后通知使用 @AfterReturning:通知方法会在目标方法返回之后调用。
- 抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛异常后调用。
- 环绕通知使用 @Around:在被通知的方法通知之前和通知之后执行自定义的行为。