跟我学代码架构设计模式之--切面思想和代理模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1857518575/article/details/85060521

最近比较忙,文章只写要点,具体细节扩展请自行搜集资料。

一 、要解决的问题

java面向对象设计里面,最初只考虑了类和类继承这一层纵向关系:越公共越通用的方法都在父类里面,越具体的方法都在子类里面。在某一个系统里面一般会有许许多多的类继承体系关系,比如人员管理系统中会有人员继承体系、组织机构继承体系等等,单看在某一种类的继承关系里面各自包含各自体系的操作方法基本没啥问题,但是有这样一类操作,比如打印log、事务处理、权限认证等操作方法,这些方法归在哪个继承体系的基类里面都不合适,但是所有的或者某些组的继承体系都会需要使用到这些操作,比如有这么一种需求:需要已有系统的所有类的所有方法调用前追加打印log操作方法,单靠继承这一手段可能就不够用了,怎么办?--- AOP之~

二、拿什么思想来应对--AOP思想

AOP思想提出了这么几种角色:被切入的类,被切入的类中操作方法、需要在被切入的类方法中介入的类、需要介入的类中的操作方法。一句化描述就是我需要用哪个类的哪个方法去切入到哪个类的哪个操作方法中,再具体点还可以指定切入到被切入方法的执行前、执行后、还是异常抛出后~ 拿打Log举例:写一个Log类,log类中包含各个级别的打印日志操作,操作参数为被打Log的类的类名,这个Log类就是介入类,log方法就是介入操作方法,其他的系统中所有需要打印log的类都是被切入的类,被切入的类中需要打印log的方法为被切入操作方法~

三、具体如何实现--代理模式

要想思想上面的AOP思想,就引入了代理模式或者装饰模式

1 最直观的代理--静态代理

写法套路:四个角色:1 要代理的类所实现的接口  2 被代理的类  3 代理类  4 介入的类。其中被代理的类和代理的类都实现1中所说的接口;介入的类就是AOP中的介入类来给被代理的类方法提供额外的功能;被代理类作为代理类的成员变量保存到代理类中。拿打Log举例,代理类对接口指定的所有方法实现中,先调用调用Log类中的方法,然后调用被代理的类中的对应方法~静态代理的缺点很明显,一切都要自己手写JAVA代码然后编译~ 类多的话 这根本就不好办~

2 动态代理(JAVAPROXY、ASM、CGLIB、JAVASSIST、BYTEBUDDY都是这一类)

所谓动态代理涉及到的角色和静态代理其实是一样的,只不过动态代理是直接操作JAVA编译出来的字节码.class,而不是在JAVA源码的层次上做改动,这样有什么好处呢:可以运行时期给加载到VM系统中的类动态增强或者直接继承系统中已有的类来实现运行时的代理类,我们不再需要手动编写代理类的源代码然后手动编译成.class字节码了~我们只需要手动写介入类,这是我们自己的介入业务逻辑类,然后写动态代理类生成逻辑,把我们的介入类逻辑织入到代理类里面去就OK了

下面简要说下常见的动态代理框架~

java自带的动态代理:只能代理接口~对已有系统的类不好办~

CGLIB、JAVASSIST、ASM、BYTEBUDDY:可以直接继承现有类来生成代理类~有的还自带运行时编译器

ASM的简要工作原理:框架先读取要代理的类,按照固定的方式遍历字节码中的类名、字段、方法等,对每种类型的遍历都调用用户指定的责任链管道来过滤和修改,管道最终走完后生成修改过的字节码,这时候的字节码就是动态代理类了,里面织入了介入类中的方法~

(完)

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/85060521
今日推荐