1.什么是Spring AOP?
AOP(Aspect Oriented Programming)面向切面编程,是OOP(面向对象编程)的延续
AOP,即通过运行时动态代理的方式,在实现不修改源码的情况下,给程序动态的添加功能的一种技术。
AOP,最主要的目的就是完成解耦
2.AOP 名词介绍
1.切面 Aspect
切面,即:切入系统的一个切面(类似于一个苹果被切开两半)。比如事务管理是一个切面,权限管理也是一个切面;
针对事务处理,需要对service.impl.*包下的所有class类作事务控制,这就是一个切面。
通常指是一个类,里面可以定义切入点和通知。
2.连接点 JoinPoint
连接点,即:程序执行过程中的某一行为。
比如:impl包下的xxx类,xxx.get()方法的调用 或者 xxx.find()方法抛出异常等行为,都是一个个连接点(侧重点是:行为)
还有就是,自己可以手动定规则,比如说以query*开头、find*开头的方法,就进入事务操作
其实连接点,通俗来讲就是,告诉系统一个规则,满足这个规则了,就开始进行切入连接操作
3.通知 Advice
通知,即:"切面"对于某个"连接点"所产生的动作。
一旦在调用过程中,满足连接点的规则,那么就会触发一个通知(通知会去干嘛?----->通知就会调用代理来完成相关操作)
比如:针对事务处理,在service完成对数据操作,如果某个dao操作数据库抛出异常了,按我们正常逻辑则需要回滚。
通知就是在满足连接点抛出异常这个规则后,告诉它需要切入一个什么方法
4.切入点 Pointcut
切入点,即:某一个具体的Bean中的某一个具体的方法,使用表达式来决定
就是具体的方法,比如impl实现类中的每个方法
5.目标对象 Target Object
目标对象,即:被一个或者多个切面所通知的对象。如:AServcieImpl 和 BServiceImpl
当然在实际运行时并不会去直接操作我们的类。SpringAOP采用代理实现,实际 AOP 操作的是 TargetObject 的代理对象。
实际上,目标对象就是代理对象所持有需要操作类的的引用
3.通知(Advice)类型又是啥?
1.前置通知 Before advice
在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。
2.后置通知 After advice
当某连接点(JoinPoint)退出的时候执行的通知(不论是正常返回还是异常退出)
3.返回后通知 After return advice
在某连接点正常完成后执行的通知,不包括抛出异常的情况
4.抛出异常后通知 After throwing advice
在方法抛出异常退出时执行的通知。
5.环绕通知 Around advice
包围一个连接点的通知,类似 Web 中 Servlet 规范中的 Filter 的 doFilter 方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。类似于一个拦截器链InterceptorChain (什么场景下使用环绕通知:权限管理)
4.AOP切入点表达式的解析
直接上图解释,一看便懂!!!
5.有几种方法来使用Spring AOP
①一种是中规中矩的 xml 配置方式。
②一种是比较方便和强大的注解方式。
具体使用:参见上篇:8.Spring AOP切面配置 && 单元测试
6.Spring AOP主要在哪些地方有用到
①Transaction 事务管理
②Authentication 权限管理
③Logging 日志管理
④Caching 缓存
⑤Interceptor 拦截器 等等等(还有Debugging 调试、Moniter 监听等方面,有待进一步细了解)
7.Spring AOP源码分析
参见下文:SpringAOP源码分析