注意本文中的AOP概念指的是整个AOP中的概念,并非局限于Spring,当然大多都在Spring中有体现
一、什么是AOP 面向切面编程,加入了横切逻辑,对诸如权限管理、日志管理提供了更好的解决方案
二、AOP 的实现机制分为两类 静态AOP实现 和 动态 AOP实现
三、Java平台上得AOP实现机制
1、动态代理 —— Proxy InvacationHandler (spring中的主要实现机制)
2、动态字节码增强 —— CGLIB (spring中的主要实现机制,对未实现接口的类进行横切的机制)
3、java代码生成 —— 早期j2ee的实现
4、自定义类加载器 —— 加载类的时候做手脚改变字节码
5、AOL语言扩展 —— AspectJ
四、AOP的基本概念
1、JoinPoint 指可以插入横贴逻辑的地方
JoinPoint的类型 方法调用、方法执行、构造方法方法调用、构造方法方法执行、方法执行、字段设置、字段获取、异常处理、类初始化
spring只支持方法执行的JoinPoint
2、Pointcut 指Joinpoint的表达方式;对于一个系统来说可能会有成千上万个Joinpoint, 如此之多的Joinpoint如何描述?用Pointcut !
1>直接指定joinPoint所在的方法名称。
2>正则表达式
3>使用AspectJ表达语言
4>将Pointcut 进行集合运算
3、Advice 横贴逻辑 就是说你到底要干什么。
分为 Befor Advice 、AfterAdvice、Around Advice、Introduction
Befor Advice:Joinpoint指定位置之前执行
AfterAdvice:Joinpoint指定位置之后执行。
AfterAdvice又细分为After returning Advice(Joinpoint指定位置正常完成才执行)、After throwing Advice(Joinpoint指定位置抛出异常才执行)、After Advice(Joinpoint指定位置不论是否正常完都执行,spring中没有实现)
Around Advice:Joinpoint指定位置之前和之后都执行,甚至可以忽略原有逻辑,spring中没有直接定义对应接口,沿用AOP alliance的表中接口
Introduction:不同于以上各种按处理时机划分,Introduction可以为原有对象添加功能和特性
4、Aspect ——Pointcut 和 Advice 的组合,指明哪些地方(Pointcut )要加入哪些逻辑(Advice )Spring中最初没有完全明确的Aspect概念。Advisor代表Spring中的Aspect,与正常的Aspect不同,Advisor只能持有一个Pointcut和一个Advice,而理论上可以是多个。