简介
cglib是一套java动态代理实现框架,cglib被应用到spring app,hibernate等高级业务框架,spring事务在业务实现类未实现接口的情况下也会使用该技术。
实际上,cglib基于继承实现,这也就意味着final,private相关的method无法被代理。基于asm框架对class字节码编辑改动,从而达到动态代理的目的,总之,被代理类没有实现接口的情况下cglib为首选
引用官网介绍的一段话:
Byte Code Generation Library is high level API to generate and transform JAVA byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access.
github地址:https://github.com/cglib/cglib
cglib作者博客:http://mydailyjava.blogspot.no/2013/11/cglib-missing-manual.html
实现动态代理的几种方案
-javasisit
-jdk 动态代理
-cglib
-asm(cglib 内部也是用asm更改其字节码)
callbacks简介
这里的callback可以认为是cglib用于生成字节码的实现手段,cglib一共实现了6种callback,用于对代理类目标进行不同手段的代理,非常灵活,分别为:
-FixedValue
-InvocationHandler
-LazyLoader
-MethodInterceptor
-Dispatcher
-NoOp
当然,cglib不只是这些内容。在实现的生成proxy的同时,作者抽象了很多东西,这包括
-缓存机制
-生成策略
-弱引用WeakHashMap,WeakReference
-LoadingCache搭配FutureTask线程竞争模型
-对反射的封装
-对asm的封装
-类加载的ClassLoader
-灵活的Function设计
cglib原理实践demo
https://github.com/cderlearner/jaop
定义一个接口CgFactory指定生成定制的代理类,拷贝cglib的源码做了修改,通过demo实践深刻理解asm如何应用。
网友评论