博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP中的动态代理
阅读量:6849 次
发布时间:2019-06-26

本文共 1753 字,大约阅读时间需要 5 分钟。

0  前言

    前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常。根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激发了我学习Spring事务方面的兴趣。而Spring事务的实现是根据AOP来实现的,对于我这个小菜鸟,只能一步一步来了,决定先从Spring的AOP开始。

1  动态代理

    Spring AOP中使用了两种动态代理,一种是JDK的动态代理,一种CGLIB的动态代理。JDK的动态代理必须指定接口,这些接口都是已经被代理对象实现了的;而CGLIB代理则不需要指定接口。

1.1 JDK动态代理

JDK的动态代理网上有很多资料,这里只说我自己的理解。

JDK动态代理必须实现InvocationHandler接口,然后通过Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)获得动态代理对象。

示例:

 
View Code

所有方法都会被导向调用InvocationHandler接口的唯一的方法invoke,这个就是我们在被代理对象前后插入相关逻辑的地方。

1.2 CGLIB动态代理

1.2.1 CGLIB的代理用法

使用CGLib动态代理,被代理类不需要强制实现接口。

CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。

示例:

 
View Code

intercept方法中的参数:Object obj为由CGLib动态生成的代理类实例,Method method为被代理类中的方法引用,Object[] args为参数值列表,MethodProxy为生成的代理类对方法的代理引用。

1.2.2 CGLIB的过滤功能

CallbackFilter可以实现不同的方法使用不同的回调方法,用于分发不同的拦截器。

示例:

 
View Code

2  Spring AOP中的动态代理机制

    Spring AOP中的代理根据被代理对象是否实现了接口选择不同的生成代理对象的方式,即第1部分中的两个情况。

2.1 JdkDynamicAopProxy

    如果被代理对象实现了需要被代理的接口,则使用JDK的动态代理,在Spring AOP中对应的包装类为JdkDynamicAopProxy。

    JdkDynamicAopProxy类实现了InvocationHandler接口,将被代理对象和拦截器作为参数传入,然后生成代理对象。

    当代理对象被调用时,JdkDynamicAopProxy的invoke方法作为Proxy对象的回调函数而被触发,从而通过invoke的具体实现,来完成对目标对象方法调用的拦截或者说功能增强的工作。

    在invoke方法中,设置了包括获取目标对象、拦截器链,同时把这些对象作为输入,创建了ReflectiveMethodInvocation对象,通过这个ReflectiveMethodInvocation对象来完成对AOP功能实现的封装。在这个invoke方法中,包含了一个完整的拦截器链对目标对象的拦截过程,比如获得拦截器链并对其中的拦截器进行配置,逐个运行拦截器链里的拦截增强,直到最后对目标对象方法的运行。具体可以看源代码。

 
View Code

2.2 CglibAopProxy

    Cglib2AopProxy的intercept回调方法的实现和JdkDynamicAopProxy的回调实现是非常类似的,只是在Cglib2AopProxy中构造的是CglibMethodInvocation对象来完成拦截器链的调用,而在JdkDynamicAopProxy中是通过构造ReflectiveMethodInvocation对象来完成这个功能的。

3 总结

    Spring AOP的核心实现原理就是采用的动态代理,根据被代理对象是否实现了所要被代理的接口这个条件,动态代理会选择不同的实现方案。本文只是尽我所能简单的拿着各方资料来了一个汇总,是一个自己的学习总结。对于Spring AOP的设计架构是我下一步的学习目标。

转载地址:http://mcrul.baihongyu.com/

你可能感兴趣的文章
F# 入门(二):安装和使用
查看>>
渗透测试流程
查看>>
C++学习笔记 -- 虚析构函数与纯虚析构函数
查看>>
Oracle中的日期函数
查看>>
01_对象的创建方法
查看>>
one-shot 检测算法YOLO、SSD
查看>>
ansible 提示安装sshpass
查看>>
常用SQL语句
查看>>
Linux网络编程必看书籍推荐
查看>>
GitHub在windows上代码管理教程
查看>>
Android 异步处理
查看>>
Magento安装错误:PHP extension ‘mcrypt’ ‘curl’ must be loaded.
查看>>
转:linux/unix命令行终端的光标及字符控制快捷键
查看>>
Yahoo为啥赚不到钱
查看>>
搞笑的金山软件
查看>>
Windows Server 8 Beta 初体验之一:安装篇(无技术含量,安装过的人可以略过)
查看>>
《Linux设备驱动开发详解》第3版现隆重征求读者创作意见
查看>>
Skype for Business Server 2015-12-WAP-发布-2-邮件服务器
查看>>
linux下文件删除的原理精华讲解(考试题答案系列)
查看>>
《网管员世界》记者走基层采访实录
查看>>