没有合适的资源?快使用搜索试试~ 我知道了~
【前言】 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。 何为切面? 一个和业务没有任何耦合相关的代码段,诸如:调用日志,发送邮件,甚至路由分发。一切能为代码所有且能和代码充分解耦的代码都可以作为一个业务代码的切面。 我们为什么要AOP? 那我们从一个场景举例说起: 如果想要采集用户操作行
资源推荐
资源详情
资源评论
AOP从静态代理到动态代理(从静态代理到动态代理(Emit实现)详解实现)详解
【前言】【前言】
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事
务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理
则以Spring AOP为代表。
何为切面?何为切面?
一个和业务没有任何耦合相关的代码段,诸如:调用日志,发送邮件,甚至路由分发。一切能为代码所有且能和代码充分解耦的代码都可以作为一个业务代码的切
面。
我们为什么要我们为什么要AOP??
那我们从一个场景举例说起:
如果想要采集用户操作行为,我们需要掌握用户调用的每一个接口的信息。这时候的我们要怎么做?
如果不采用AOP技术,也是最简单的,所有方法体第一句话先调用一个日志接口将方法信息传递记录。
有何问题?有何问题?
实现业务没有任何问题,但是随之而来的是代码臃肿不堪,难以调整维护的诸多问题(可自行脑补)。
如果我们采用了AOP技术,我们就可以在系统启动的地方将所有将要采集日志的类注入,每一次调用方法前,AOP框架会自动调用我们的日志代码。
是不是省去了很多重复无用的劳动?代码也将变得非常好维护(有朝一日不需要了,只需将切面代码注释掉即可)
接下来我们看看AOP框架的工作原理以及实过程。
【实现思路】【实现思路】
AOP框架呢,一般通过静态代理和动态代理两种实现方式。
何为静态代理?何为静态代理?
静态代理,又叫编译时代理,就是在编译的时候,已经存在代理类,运行时直接调用的方式。说的通俗一点,就是自己手动写代码实现代理类的方式。
我们通过一个例子来展现一下静态代理的实现过程:
我们这里有一个业务类,里面有方法Test(),我们要在Test调用前和调用后分别输出日志。
我们既然要将Log当作一个切面,我们肯定不能去动原有的业务代码,那样也违反了面向对象设计之开闭原则。
那么我们要怎么做呢?我们定义一个新类 BusinessProxy 去包装一下这个类。为了便于在多个方法的时候区分和辨认,方法也叫 Test()
这样,我们如果要在所有的Business类中的方法都添加Log,我们就在BusinessProxy代理类中添加对应的方法去包装。既不破坏原有逻辑,又可以实现前后日志
的功能。
当然,我们可以有更优雅的实现方式:
我们可以定义代理类,继承自业务类。将业务类中的方法定义为虚方法。那么我们可以重写父类的方法并且在加入日志以后再调用父类的原方法。
当然,我们还有更加优雅的实现方式:
我们可以使用发射的技术,写一个通用的Invoke方法,所有的方法都可以通过该方法调用。
我们这样便实现了一个静态代理。
那我们既然有了静态代理,为什么又要有动态代理呢?那我们既然有了静态代理,为什么又要有动态代理呢?
我们仔细回顾静态代理的实现过程。我们要在所有的方法中添加切面,我们就要在代理类中重写所有的业务方法。更有甚者,我们有N个业务类,就要定义N个代
理类。这是很庞大的工作量。
这就是动态代理出现的背景,相比都可以猜得到,动态代理就是将这一系列繁琐的步骤自动化,让程序自动为我们生成代理类。
何为动态代理?何为动态代理?
动态代理,又成为运行时代理。在程序运行的过程中,调用了生成代理类的代码,将自动生成业务类的代理类。不需要我们手共编写,极高的提高了工作效率和调
整了程序员的心态。
原理不必多说,就是动态生成静态代理的代码。我们要做的,就是选用一种生成代码的方式去生成。
今天我分享一个简单的AOP框架,代码使用Emit生成。当然,Emit 代码的写法不是今天要讲的主要内容,需要提前去学习。
先说效果:
定义一个Action特性类 ActionAttribute继承自 ActionBaseAttribute,里面在Before和After方法中输出两条日志;
剩余10页未读,继续阅读
资源评论
weixin_38698433
- 粉丝: 4
- 资源: 969
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功