一.手写Aop前基础知识
1.aop是什么?
面向切面编程(AOP):是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。
AOP为开发者提供一种进行横切关注点(比如日志关注点横切了支付关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。
2.aop能干什么?
AOP主要用于横切关注点和织入,因此需要理解横切关注点和织入:
- 关注点:可以认为是所关注的任何东西,比如上边的支付组件;
- 关注点分离:将问题细化从而单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件;
- 横切关注点:一个组件无法完成需要的功能,需要其他组件协作完成,如日志组件横切于支付组件;
- 织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。
横切关注点可能包含很多,比如非业务的:日志、事务处理、缓存、性能统计、权限控制等等这些非业务的基础功能;还可能是业务的:如某个业务组件横切于多个模块。
面向切面方式,先将横切关注点分离,再将横切关注点织入到支付系统中:
3.aop的优点?
- 完善OOP;
- 降低组件和模块之间的耦合性;
- 使系统容易扩展;
- 而且由于关注点分离从而可以获得组件的更好复用。
二.aop底层实现原理:代理模式
关于静态代理模式,详情请参阅我另一片博客:
https://www.cnblogs.com/tc971121/p/13474638.html
三.手写aop主要实现过程
1.定义配置标记
@Aspect:配置标记横切对象(方法)的地址
@Order:配置标记横切的顺序
@Aspect/@Order
2.定义默认切面类
3.定义切面织入器
核心流程:
1.获取所有的切面类
2.遍历容器管理的类
3.筛选出匹配容器管理类的切面aspectlist
4.尝试进行Aspect的织入 生成动态代理对象 并替换beancontainer中原先class对应所对应的实例对象
切面信息包装类(增强的动作/增强对象地址/横切顺序)
采用cglib动态的实现方式:
实现net.sf.cglib.proxy.MethodInterceptor接口,定义代理后方法的动作(相当于实现jdk动态代理中的InvocationHandler接口)
创建代理类:
解析Aspect表达式并且定位被织入的目标工具类:
总结实现aop的主要流程:
1.定义配置标记
2.定义默认切面类
3.定义切面织入器
核心流程:
1.获取所有的切面类
2.遍历容器管理的类
3.筛选出匹配容器管理类的切面aspectlist
4.尝试进行Aspect的织入 生成动态代理对象 并替换beancontainer中原先class对应所对应的实例对象
4.其他类:切面信息包装类/InvocationHandler实现类/创建代理实例类/解析Aspect表达式工具类等。
参考博客地址:https://www.iteye.com/blog/jinnianshilongnian-
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/17529.html