一、基本概念:
AOP即面向切面编程,主要用来解决一些系统层面上问题,如日志、事物、权限等。与oop的比较,oop引入封装、继承、多态等概念,允许开发者定义纵向的关系;aop处理横向的关系,将那些影响了多个类的公共行为封装到可重用的模块
切面即那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低代码耦合性
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
二、AOP的基本概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称为横切关注点
2、切面(aspect)
即对横切关注点的抽象,在切面类上加上注解@Aspect
3、连接点(joinpoint)
指的就是被拦截到的方法、字段或者构造器
a> JoinPoint
JoinPoint对象封装了springAop切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象
常用api:
Signature getSignature(); 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs(); 获取传入目标方法的参数对象
Object getTarget(); 获取被代理的对象
Object getThis(); 获取代理对象
b>ProceedingJoinPoint
是JoinPooint的子接口,该对象只用在@Around切面方法中
api:
Object proceed() throws Throwable //执行目标方法
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法
两个方法.
4、切入点(pointcut)
对连接点进行拦截的定义
格式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
括号中各个pattern分别表示:
-
修饰符匹配(modifier-pattern?)
-
返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
-
类路径匹配(declaring-type-pattern?)
-
方法名匹配(name-pattern)可以指定方法名 或者 代表所有, set 代表以set开头的所有方法
-
参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(…)表示零个或多个任意参数
-
异常类型匹配(throws-pattern?)
-
其中后面跟着“?”的是可选项
5、通知(advice)
- @Before:前置通知;方法执行前通知
- @after:后置通知,方法执行之后通知(无论是否发生异常,都通知)
- @afterRunning:返回通知,在方法返回 结果之后通知(正常结束,才通知)
- @afterThrowing:异常通知,在方法抛出异常后通知
- @Around:环绕通知,通过调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法
6、目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
三:Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB
遗留:连接点和切点的关系???