前言
AOP(Aspect Oriented Programming)面向切面编程,是一种编程技术。
AOP是对OOP(面向对象)的补充延伸。
AOP底层使用的就是动态代理实现的。
Spring的AOP使用的动态代理是:JDK动态代理+CGLIB动态代理技术,Spring在这两种动态代理中灵活切换,如果是代理接口,会默认使用JDK动态代理,如果要代理某个类,这个类没有实现接口,就会切换使用CGLIB。当然,也可以强制通过一些配置让Spring只使用CGLIB。
一、介绍AOP
将与业务逻辑无关的(非业务逻辑)代码,单独的提取出来,形成一个横向的切面,独立的组件。核心业务是纵向的,然后把横向的切面以横向交叉的方式应用到业务流程当中的过程叫做面向切面编程。
一般一个系统当中都会有一些系统服务,例如:日志、事务管理、安全等。这些系统服务被称为:交叉服务
如果在每一个业务处理过程当中,都掺杂这些交叉代码进去的话,存在两方面问题:
- 第一:交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码没有得到复用。并且修改这些业务代码的话,需要修改多处。
- 第二:程序员无法专注核心业务代码的编写,在编写核心业务代码的同时还要处理这些交叉业务。
使用AOP可以很轻松解决以上问题
将与核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式应用到业务流程当中的过程被称为AOP
AOP 的优点:
第一:代码复用性增强
第二:代码易维护
第三:使开发者关注业务逻辑
二、面向切面编程的七大术语
连接点 Joinpoint:在程序的整个执行流程当中,可以织入切面的位置。方法执行前后,异常抛出之后等位置。连接点描述的是位置
切点 Pointcut:在程序执行流程中,真正织入切面的方法。 切点本质上就是方法
通知 Advice:通知又叫做增强,就是具体要织入的代码。包括:前置通知(目标方法执行之前)、后置通知(目标方法执行之后)、环绕通知(目标方法前后)、异常通知(catch)、最终通知(finally)通知描述的是代码
切面 Aspect:切点+通知就是切面。
织入 Weaving:把通知应用到目标对象上的过程。
代理对象 Proxy:一个目标对象被织入通知后产生的新对象。
目标对象 Target:被织入通知的对象
三、切点表达式
切点表达式用来定义通知往哪些方法上切入
切入点表达式语法格式:
execution([访问控制权限修饰符] 返回值类型 [全限定类名] 方法名(形式参数列表) [异常])
访问控制权限修饰符:
写public就表示只包括公开的方法
没写,就是4个权限都包括
可选项
返回值类型:
必须填
*表示返回值类型任意
全限定类名:
可选项
两个点“…”表示当前包以及子包下的所有类
省略时表示所有的类
方法名:
必填项
表示所有的方法
set表示所有的set方法
形式参数列表
必填项
()表示没有参数的方法
(…)参数类型和个数随意的方法
()只有一个参数的方法
(,String)第一个参数类型随意,第二个参数是String的
异常:
可选项
省略时表示任意类型的异常