spring-面向切面AOP

178 阅读3分钟

layout: post title: "spring-面向切面AOP" subtitle: " "其实就是拦截器"" date: 2018-11-08 06:00:00 author: "青乡" header-img: "img/post-bg-2015.jpg" catalog: true tags: - spring - spring AOP - spring 面向切面

什么是面向切面

拦截器。

怎么使用?

1.管理器 //Advisor(切面)
管理2和3。 spring里面的概念,开发过程中不需要做任何处理和配置。

2.哪些业务类的哪些方法 //Pointcut(切点)
3.在方法的前面、后面还是前面/后面 //Advice(增强)

4.切面类
正常的业务类.方法执行开始之前/完成之后,需要执行的切面类.方法。

以上三个问题,在AOP中占用重要的地位,因为Spring AOP的主要工作就是围绕以上三点展开:Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前、方法后、方法的两端等)。此外,Spring通过Advisor(切面)将Pointcut和Advice两者组装起来。有了Advisor的信息,Spring就可以利用JDK或CGLib的动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象了。

底层实现原理

动态代理。


有2种技术,
1.jdk //面向接口,只能是接口。
1)代理类Proxy
2)业务类InvokerHandler

2.第三方开源-CGLib //可以是类。

问题来了,spring是使用的哪一种代理技术呢?看源码。

源码分析

使用的是CGLib。3.0之前依赖CGLib.jar,之后集成了CGLib.jar,在core.jar里。但是不知道为什么,官方下载的源码proxy这一块代码都没有。

动态代理技术

jdk

研究源码。

CGLib

研究源码,是基于jdk的动态代理技术吗?

面向切面和控制反转有什么关系吗

没有关系。2个独立的核心模块。1个是注入数据,1个是拦截器什么的。但是二者可以结合使用。

1.注入数据
思想沿袭自最早的MVC框架-struts。
2.拦截器
思想沿袭自j2ee里的servlet规范-过滤器,只不过spring的拦截器框架封装的更完善更好用而已。

应用场景

但凡是类似拦截器这样的功能,即拦截每个类做点什么事情,都是面向切面,
1.日志 //进入方法和退出方法
2.执行时间 //性能监控
3.角色和权限
4.事务

工作应用

单机事务

需求
spring事务基于面向切面技术。每个应用程序的标配,每个应用程序都会需要事务功能,所以都会配置事务。


代码

分布式事务

需求
在分布式事务里,有一个需求是需要保存执行成功的方法和失败的方法,怎么保存呢?主活动和子活动保存在了数据库,但是这些子活动不能区分是成功还是失败,怎么区分呢?子活动成功了加一个标志,失败了就没有那个标志。

怎么加标志?就是在方法执行完之后,执行切面类的方法,做一下处理即可。

做一下处理可以,但是切面类怎么知道方法是正常执行成功,还是异常退出呢?如果方法正常执行完成,那么就执行切面的方法;如果方法抛出错误,切面类的方法是不会执行的。


代码实现

参考

www.iteye.com/topic/11232…