什么是AOP?
AOP,即我们平时经常提到的面向切面编程。首先我们要理解一个叫**横切关注点(cross-cutting concern)**的概念,它其实是描述我们应用中的功能,假如有一个功能,它在应用程序中很多个地方都用了,那么我们把这样的功能称之为横切关注点
。
日常开发中,我们都会将不同的业务场景抽象出对应的模块进行开发,而不同的模块,除了那些针对特定领域的核心功能外,还有一些相同的辅助功能,比如日志管理、安全管理、事务管理等等。横切关注点
这个概念其实就点明了:类似这样的功能就是我们面向切面编程需要关注的地方。这也是面向切面编程的意义所在:它帮助我们实现横切关注点和他们所影响的对象之间的解耦。
面向切面编程的实质,就是讲横切关注点模块化成称为切面的特殊的类。
AOP术语
以下讨论都基于SpringAOP
通知(Advice)
切面的工作被称为通知。也就是定义了切面的要做什么,以及何时做的问题。下面是Spring切面有5种类型的通知,以及相对应的在SpringBoot中的五个注解
- 前置通知(Before):方法调用之前,对应
@Before
- 后置通知(After):方法调用之后(不关心方法输出是什么)对应
@After
- 返回通知(After-returning):目标方法成功执行之后,对应
@AfterReturning
- 异常通知(After-throwing):目标方法抛出异常之后,对应
@AfterThrowing
- 环绕通知(Around):方法调用之前和之后,对应
@Around
后置通知和返回通知的区别
后置通知应用时机在返回通知之后,任何情况下都会应用,而返回通知只有方法正常执行
正常返回后执行
环绕通知与其它通知的区别
不同于其它的通知,环绕通知有目标方法的执行权,能够控制目标方法是否执行。而其它的通知更多是对目标方法的一个增强,无法影响目标方法的执行
以上两点,我们下面会通过一个例子更好的体会其中的差异。
连接点(Join point)
程序中那些我们想要应用通知的地方,就是连接点。这个点可以是我们调用方法时、抛出异常时或甚至是修改某一个字段的时候。切面代码(通知)可以通过这些点插入到应用的正常流程中,是原本的功能增添新的行为。
切点(Pointcut)
我们的应用程序可能会有很多个连接点需要我们应用通知,所以我们有必要把连接点的分类汇总,抽象出相同的特点,好让正确的切面切入到正确的地方去,各司其职,而不是切入所有的连接点。切点