JAVA 静态代理和动态代理
- 格式:pdf
- 大小:120.14 KB
- 文档页数:5


aop实现方法AOP呢,就像是给你的代码世界请了个超级小助手。
那AOP到底咋实现呢?咱先来说说静态AOP的实现。
这就有点像提前规划好一切的感觉。
比如说,你要盖房子,你得先把那些框架结构啥的都规划好,静态AOP就是在编译的时候就把那些横切关注点(就是那些到处都可能用到的功能,像日志记录呀)都安排到代码里去。
就好比你在盖房子的时候,直接把水电管道的线路都设计在墙里面一样。
不过呢,这种方式有点不够灵活,一旦你的需求有点小变化,就像你突然想在墙上再加个插座,那可就有点麻烦喽。
再来说说动态AOP的实现。
这可就灵活多啦,就像是个百变精灵。
它是在运行的时候才把那些横切关注点织入到代码里。
这就好比你房子盖好了,但是你可以随时根据需要在墙上钉个挂钩或者贴个装饰画啥的。
在Java里呢,有像AspectJ这样超酷的工具可以用来做动态AOP。
它可以让你很方便地定义切点(就是在哪些地方要加入那些额外的功能),比如说你想在某个方法被调用之前或者之后加入日志记录功能,你就可以轻松地用AspectJ来搞定。
还有哦,代理模式也是AOP实现的一种常见办法。
想象一下,你有个小跟班,这个小跟班就像是代理。
你要做啥事儿的时候,小跟班可以先去做一些准备工作或者善后工作。
比如说你要去参加一个聚会,小跟班可以先去给你打探一下情况(这就像是在方法调用之前的操作),聚会结束了小跟班还能帮你收拾东西(这就像是方法调用之后的操作)。
在Java里,有动态代理和静态代理呢。
动态代理就更智能一些,它可以根据不同的接口来创建代理对象,就像这个小跟班可以根据不同的情况来调整自己的工作内容。
AOP的实现方法各有各的妙处,就看你的代码需求像个啥脾气啦。
如果你的需求比较固定,静态AOP可能就够用啦。
要是你的需求像个调皮的小猴子,老是变来变去的,那动态AOP或者代理模式可能就更适合你哦。
反正呀,掌握了这些AOP的实现方法,就像你在代码的魔法世界里多了好多神奇的小法术,可以让你的代码更优雅、更高效呢。
Autofac⾼级⽤法之动态代理前⾔Autofac的DynamicProxy来⾃⽼牌的Castle项⽬。
DynamicProxy(以下称为动态代理)起作⽤主要是为我们的类⽣成⼀个代理类,这个代理类可以在我们调⽤原本类的⽅法之前,调⽤拦截器以实现AOP。
那么动态代理是怎么实现的呢,这⾥简单⼀下提⼀下,这⾥主要是⽤了emit技术动态⽣成IL,相当于在内存中⽤IL给我们编写了⼀个Class。
通过静态代理实现A O P我们新建⼀个类Cat,并实现ICat接⼝ICat:public interface ICat{void Eat();}Cat:public class Cat:ICat{public void Eat(){Console.WriteLine("猫在吃东西");}}然然后我们为其创建⼀个代理类,CatProxypublic class CatProxy:ICat{private readonly ICat _cat;public CatProxy(ICat cat){_cat = cat;}public void Eat(){Console.WriteLine("猫吃东西之前");_cat.Eat();Console.WriteLine("猫吃东西之后");}}现在我们调⽤⼀下试试效果:public class Progarm{static void Main(string[] args){ICat icat=new Cat();var catProxy=new CatProxy(icat);catProxy.Eat();Console.Read();}}可以看见,我们已经成功的通过代理实现在猫吃东西之前和之后执⾏我们定义的代码,这就是⼀个简单的AOP,这个称之为静态代理,需要我们⼿动编写代理类,这个是⼗分耗费时间的,那么有什么⽅法帮我们⾃动⽣成代理呢,当然有了,接下来介绍我们的动态代理。
javaagent技术原理及简单实现1、引⼦在某天与QA同学进⾏沟通时,发现QA同学有针对某个⽅法调⽤时,有让该⽅法停⽌⼀段时间的需求,我对这部分的功能实现⾮常好奇,因此决定对原理进⾏⼀些深⼊的了解,⼒争找到⼀种使⽤者尽可能少的对原有代码进⾏修改的⽅式,以达到对应的MOCK要求。
整体的感知程度可以分为三个级别:硬编码增加配置⽆需任何修改2、思路在对⽅法进⾏mock,暂停以及异常模拟,在不知道其原理的情况下,进⾏猜想,思考其具体的实现原理,整体来说,最简单的实现模型⽆外乎两种:2.1 朴素思路假设存在如下的函数publicObject targetMethod(){System.out.println("运⾏");}若想要在函数执⾏后暂停⼀段时间、返回特定mock值或抛出特定异常,那么可以考虑修改对应的函数内容:public Object targetMethod(){ //在此处加⼊Sleep return 或 throw逻辑 System.out.println("运⾏");}或使⽤类似代理的⽅法把对应的函数进⾏代理:public Object proxy(){ //执⾏Sleep return 或 throw逻辑 return targetMethod();}public Object targetMethod(){ System.out.println("运⾏");}2.2 略成熟思路在朴素思路的基础上,我们可以看出,实现类似的暂停、mock和异常功能整体实现⽅案⽆外乎两种:代理模式深⼊修改内部函数在这两种思路的基础上,我们从代理模式开始考虑(主要是代理使⽤的⽐较多,更熟悉)2.2.1 动态代理说起代理,最常想到的两个词语就是静态代理和动态代理,⼆者却别不进⾏详述,对于静态代理模式由于需要⼤量硬编码,所以完全可以不⽤考虑。
针对动态代理来看,开始考虑最具代表性的CGLIB进⾏调研。
一、名词解释(共5小题每题3分,共15分)1、MVC :Model、View和Controller,是一个设计模式,它强制性地使应用程序的输入、处理和输出分开,三个部分以最小的耦合协同工作,以增加程序的可扩展性和可维护性;2、OGNL:Object Graphic Navigation Language(对象图导航语言),是一个开源项目,是一种功能强大的EL(表达式语言),可通过简单的表达式来访问Java对象中的属性;3、持久化:即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘),是将程序数据在持久状态和瞬时状态间转换的机制;4、ORM:对象关系映射,是用于将对象与对象之间的关系对应到数据库表与表之间关系的一种模式;5、通知(Advice):定义了切面中的实现类型是指在定义好的切入点处所有执行的程序代码;6、事务:是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰;7、POJO类:POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称,它通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类。
8、AOP:面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术;9、IoC:Inversion of Control(控制反转),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,IoC的基本概念是不创建对象,但是描述创建它们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。
容器负责将这些联系在一起;10、HQL:Hibernate Query Language的缩写,HQL的语法很像SQL,但HQL是一种面向对象的查询语言,操作的对象是类、实例、属性等。