什么是AOP
AOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。面向切面,按照字面意思来解释,就是从某个位置切一刀,然后对该位置进行加工。
比如说我们要给业务实现层增加一段代码,用来计算某个方法的时间消耗性能。首先我们可以直接在代码中添加计时代码来实现。但是如果说,现在要在多个方法都要加这个计时代码呢?那是不是就重复工作量,一直CV大法,这不就是体力活了。一旦要把这些计时代码删掉,又要一个个方法去删,岂不人都傻了。这时候AOP思想顺势而生,我们可以将业务实现层的代码,增加切入点,然后再把计时代码植入,那么我们想用的时候,添加切入点,不想用的时候,直接删掉,是不是就方便了许多。
AOP 关键概念
切面、切入点、通知
简单地去理解,其实AOP要做三类事:
1、在哪里切入,也就是在哪些业务代码中执行。
2、在什么时候切入,是业务代码执行前还是执行后。
3、切入后做什么事,实现你的需求代码。
关键字解释
通知处理(advice):处理,包括处理时机和处理内容。处理内容就是要做什么事,比如校验权限和记录日志。处理时机就是在什么时机执行处理内容,分为前置处理(即业务代码执行前)、后置处理(业务代码执行后)等。
切入点(pointcut):切点,决定处理如权限校验、日志记录等在何处切入业务代码中(即织入切面)。切点分为execution方式和annotation方式。前者可以用路径表达式指定哪些类植入切面,后者可以指定被哪些注解修饰的代码植入切面。
切面(aspect):切面,即Pointcut和Advice。我们放置的通知的点所连接成的几何图形所形成的一个面,就叫切面。
织入(weave):将额外功能放到某个功能上,就叫织入;
通知类型
前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
后置通知(After returning advice):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
异常通知(After throwing advice):在方法抛出异常退出时执行的通知。
最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
环绕通知是最常用的通知类型,和AspectJ(AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法)一样,Spring提供所有类型的通知,推荐你使用尽可能简单的通知类型来实现需要的功能。例如,如果你只是需要一个方法的返回值来更新缓存,最好使用后置通知而不是环绕通知,尽管环绕通知也能完成同样的事情。用最合适的通知类型可以使得编程模型变得简单,并且能够避免很多潜在的错误。比如,你不需要在JoinPoint上调用用于环绕通知的proceed()方法,就不会有调用的问题。
用SpingBoot Aop的话,依赖的maven坐标是:
用AspectJ的话,依赖的maven坐标是: