在工作中经常会用到aop,一直对aop似懂非懂的样子,虽然不影响工作,但是还是很想弄清中间的原有。下面是个人对aop的认识以及总结,仅供参考。
一,aop的总体概念;
把多个应用中的共同需要进行处理的业务逻辑提出来作为一个特有或者共有的模块。
乍一看aop貌似很像java中的继承关系 把共同的代码提出来作为父类 但是
如果在整个应用中都使用相同的基类,相信也不是我们想看到的 因此切面使我们的代码清晰简洁,
在使用面向切面编程时我们仍然在一个地方定义通用功能,但是可以通过声明的方式定义这个功能要以
何种方式在何处应用,而无需修改受影响的类。
由于本人是做java开发的对于Aop我只会记录Spring对aop的支持,后面如果有springAop满足不了需要可以参看AspectJ进行扩展。
二,Spring对AOP的支持
Spring提供了4种类型的Aop支持,基于代理的经典SpringAop 纯POJO切面 @AspectJ注解驱动的切面 注入式AspectJ切面
因为Spring Aop构建在动态代理基础之上,因此对Aop的支持局限于方法的拦截。
切面原理:Spring在运行期把切面织入到Spring管理的bean中。
原理图直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的是ApplicationContext的话,在ApplicationContext从BeanFactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来植入SpringAop的切面。
创建切面:spring创建切面需要相应的配置 有三种配置方法 基于注解 基于java配置 基于xml 由于注解简单明了 主要记录注解的方式。
常用术语:通知(advice) 切点(pointcut)和连接点(join point 其实就是实现切面方法功能的某个类方法)
通知定义了切面是干什么的以及何时干;对应的有5中类型的通知(其实更多 spring支持的就这5中 够用了)
Before 前置通知 在目标方法被调用之前调用通知功能
After 后置通知 在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
After-returning 返回通知 在目标方法成功执行之后调用通知
After-throwing 在目标方法抛出异常后调用通知
Around 环绕通知 通过包裹了被通知的方法,在被通知的方法调用之后执行自定义的行为
切点则定义了切面在什么地方干(切点指示器 其实更多 spring支持的就这几种);
arg() :限制连接点匹配参数为指定类型的执行方法
@args():限制连接点匹配参数由指定注解标注的执行方法
execution():用于匹配是链接点的执行方法(切点表达式的书写 百度很多)
this:限制连接点匹配Aop代理的bean引用为指定类型的类
target:限制连接点匹配目标对象为指定类型的类
@target:限制连接点匹配特定的执行对象,这些对象对应的类要具体指定类型的注解。
within:限制连接点匹配指定的类型
@within:限制连接点匹配指定注解所标注的类型
@annotation:限制匹配带有指定注解的连接点
切点的定义会匹配通知所要织入的一个或者多个连接点
切面是通知和切点的结合,通知和切点共同定义了切面的全部内容---->它是什么,在何时和何处完成其功能。
上图:
一个简单完整的切面当切面的通知方式为@Around时 你首先注意到可能是它接收ProceedingJoinPoint作为参数。这个对象是必须要用了 该对象是要调用proceed()方法。(意思就是执行切面的内容后 调用这个方法就会放行 不调用就会造成阻塞)
当前上面只是实现spring的一个简单的切面 还可以为通知传递参数 以及通过切面引入新的功能(不只是给类方法增加功能而是给类引入新的方法)由于这些平时开发很少用到 目前先熟练掌握简单的aop功能 对于后面需要更加复杂的功能 可参考spring aop 详细讲解书本;
网友评论