CGLib,即code generation library,原理是通过动态生成类以实现代理的功能。AOP(面向切片编程)以及AOP的一种实现方法——Java Dynamic Proxy。需要注意的是,Java动态代理是面向接口的,即被代理的类必须实现某个接口,代理类以该接口的形式出现,而使用CGLib,则没有这方面的限制,任意一个类都是可以的。 简单的说,使用CGLib代理某个类,需要在Enhancer对象中设置好基类(也就是被代理类),以及一系列回调函数Callback。Callback是一个接口,CGLib提供了6个它的子接口: Callback子接口 用途(有待确认) Dispatcher 分发给其他Callback FixedValue 仅仅返回被代理类方法的返回值,对于限定某一些特定方法很有用(因为返回值必须和被代理类方法的返回值类型相匹配) InvocationHandler 主要用于Proxy(替代Java动态代理),也可以用户Enhancer LazyLoader 与Dispatcher类似,当代理类的第一个lazily-load方法调用时才会被调用 MethodInterceptor 普通用途的回调方法,在处理逻辑(advice)前后进行处理 NoOp 直接调用基类(被代理类)的方法调用 好,那我们来假设一个场景吧。 有这样一个类RealObject,它可以查询、保存资源,比如是这样:
1 public class RealObject { 2 public void queryA () { System.out.println(“queryA”); } 3 public void queryB () { System.out.println(“queryB”); } 4 public void saveA () { System.out.println(“saveA”); } 5 public void saveB () { System.out.println(“saveB”); } 6 } […]