看到好多地方对比CGLIB和动态代理来实现AOP的, 感觉就是一边倒的. CGLIB什么都好, 比如:
- 目标对象可以是Interface或者Class,不像动态代理只支持Interface
- CGlib性能也好.
看到这些,我就有一个疑问, 既然如此优秀, 为什么动态代理还有存在的必要呢.带着这个疑问,我研究了一下CGLIB的不足.对比动态代理来实现AOP,CGLIB需要有2个前提条件,都是动态代理不存在的.
- final Class不支持, 因为CGLIB是生成子类来实现AOP,所以final Class自然无法支持了.
- 需要强制无参数构造函数
其实从JAVA实现AOP这个角度,大致有2个方法,
- 一个是通过设计模式:比如代理,装饰器,责任链之类. 这几种的前提就是前期设计比较好,也就是要设计要依赖于接口而不是实现. 比如我认为Struts2的拦截器也是AOP的一种.
- 一个就是生成子类:也就是Cglib所选择的这种方法,就会有上面所说说的2个限制.