目录
面向切面编程:
在不改变源代码的基础上对源代码进行增强
joint point :连接点: 方法的调用
Pointct :符合某种规则的连接点 切入点 ;连接点包含切入点,切入点一定是连接点,连接点不一定是切入点
Advice 通知 增强的方法
Aspect 切面 简单理解狭义上的切面:一个类包含增强的方法和指定的规则
广义上:=连接点+切入点+通知
Target Object 目标对象 :被增强的对象
weaving 织入: 通过动态代理增强指定方法
AOP面向切面编程 (Aspect Oriented Program)
Spring切面可以应用5种类型的通知:
前置通知(Before):在目标方法被调用之前调用通知功能。
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
返回通知(After-returning):在目标方法成功执行之后调用通知。
异常通知(After-throwing)):在目标方法抛出异常后调用通知。
环绕通知(Around) :通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
通知器的在不同条件下的执行情况
测试后置通知和最终通知,在有异常和没异常时执行结果是否相同
- 如果有异常,后置通知不会被执行
- 不论是否出现异常,最终通知都会被执行
- 最终通知不能获取返回值
如果所有通知都执行,其执行顺序是什么?
情况1:有异常时
- 环绕通知
- 前置通知
- 调用目标方法
- 异常通知
- 最终通知
情况2:没有异常时
1环绕通知
2前置通知
3调用目标方法
4后置通知
5最终通知
6环绕通知
AOP作用:
日志记录,权限检查,性能监控,事务控制,异常处理……
AOP的原理:
Spring会创建目标对象的代理,根据切入点规则匹配对应的连接点,把连接点变为切入点,不会直接执行目标方法,会被切面类中的通知进行增强。
AOP如何生成代理对象:如果目标对象实现了接口,那么使用java api Proxy类,如果目标对象没有实现接口,底层使用CGLIB
如果想强制使用CGLIB需要添加