【Spring】 AOP

前言

Spring两大核心思想:

1.IoC

2.AOP

一.AOP

AOP面向切面编程

Aspect Oriented Programing

切面

切面就是指某一类特定问题,所以AOP也可以理解为面向特定方法编程.

它也是一种思想,是对一类事情的集中处理.

比如,统一数据返回格式和统一异常处理都是AOP思想的一种思想.

示例

针对执行每个业务方法的耗时这个特定方法,通过AOP思想,在不改动原始方法的基础上,针对这个特定方法进行功能的增强.

实现:

(1)引入AOP依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

(2)编写AOP程序

说明:

@Aspect表示这是一个切面类

@Around环绕通知,在目标方法的前后都会被执行,后面的表达式表示对哪些方法进行增强.

ProceedingJoinPoint.proceed() 让原始⽅法执⾏


AOP的优势

通过这个程序完成了业务接口执行耗时的统计.可以看出AOP面向切面编程的一些优势

1.代码无侵入:不修改原始的业务方法,就可以对原始的业务方法进行功能的增强或者是功能的改变.

2.减少了重复代码

3.提高开发效率

4.维护方便

二.AOP详解

1.核心概念

1.1切点

作用是提供一组规则告诉程序对哪些方法进行功能增强

1.2连接点

满足切点表达式规则的方法,就是连接点,也就是可以被AOP控制的方法

如果切点是 :  execution(* com.example.demo.controller.*.*(..))

那么 com.example.demo.controller路径下的方法,都是连接点.

1.3通知 Advice

通知就是具体要做的工作,指那些要重复的逻辑.

1.4切面Aspect

切面=切点+通知

作用:描述了当前AOP程序需要针对哪些方法,在什么时候执行什么操作.

切面所在的类,我们一般称为切面类. (用@Aspect注解标识)

2.通知类型

Spring AOP的通知类型有以下几种:

Around 

环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏

Before

前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏

After

后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏

AfterReturning

返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏

AfterThrowing

异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏

程序正常运行,@AfterThrowing标识的通知方法不会执行,其他类型的执行顺序如下:

@Around 标识的通知⽅法包含两部分, ⼀个"前置逻辑", ⼀个"后置逻辑".其 中"前置逻辑" 会先于 @Before 标识的通知⽅法执⾏, "后置逻辑" 会晚于 @After 标识的通知⽅法执⾏

如果有异常情况下:

  • @AfterReturning 标识的通知⽅法不会执⾏, @AfterThrowing 标识的通知⽅法执⾏
  • @Around 环绕通知中原始⽅法调⽤时有异常,通知中的环绕后的代码逻辑也不会执⾏了(因为原始⽅法调⽤出异常了)

注意事项:

• @Around 环绕通知需要调⽤ ProceedingJoinPoint.proceed() 来让原始⽅法执⾏, 其他通知不需要考虑⽬标⽅法执⾏.

• @Around 环绕通知⽅法的返回值, 必须指定为Object, 来接收原始⽅法的返回值, 否则原始⽅法执 ⾏完毕, 是获取不到返回值的.

• ⼀个切⾯类可以有多个切点.

3.@PointCut注解

用这个注解可以定义一个公共的切点表达式,需要使用的时候直接引入就可以.

注意:

1.如果切点定义成private修饰,仅能在当前切面类使用

2.其他切面类要使用需要改成public,使用全限定类名引用: 全限定类名.方法名( )

4.@Order注解

切面优先级

当多个切面类的多个切入点都匹配都同一个目标方法时,当目标方法运行的时候,这些切面类的通知方法都会执行.

它们的执行顺序默认是按照切面类的类名字母排序的.

对于@Before通知:字母排名靠前的先执行

对于@After通知:字母排名靠前的后执行.

Spring提供了@Order注解来控制通知的执行顺序.

执行顺序:先执行优先级高的切面,再执行优先级低的切面,最后执行目标方法.

5.切点表达式

有两种常用的表达式

5.1execution表达式

根据方法的签名进行匹配

切点表达式⽀持通配符表达:

5.2@annotation   自定义注解

步骤:

5.2.1编写自定义注解

创建一个注解类(选择Annotation)

代码:

5.2.2使用@annotation表达式来描述切点

5.2.3在连接点的方法上添加自定义注解


总结

面试题

Spring AOP的实现方法

1.基于注解@Aspect

2.基于自定义注解 @Annotation

3.基于Spring API(通过xml配置的方式,现在很少用了)

4.基于代码实现(笨重,不推荐)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值