前言:
AOP是目前编程最核心的理念之一,Spring的核心可以用两个专用词汇解析,1、IOC,2、AOP;可见AOP的重要性,Java中的实现方式有几种:
静态代理:
- 设计模式例子,手写
- AspectJ,编译器织入的方式(也可以在编译后织入,以及在加载时候织入,如LWT);
动态代理:
- JDK代理
- CGLib代理
以上实现方式网上很多资料,可以参考一些官网api doc;本文简单探讨下几种实现方式的优缺点,结合应用,说下哪个功能最强大
概念:
Spring中定义的一些代理的概念,切点,切面,连接点,引入增强等,其实都是来着AspectJ,AspectJ是Java届AOP的事实标准了。
// TODO介绍下
设计模式:
设计模式有一章是专门介绍代理模式的,我们可以简单的手写一个代理类,也是我们的入门基础了;
优点:
完全不依赖框架,可以自己代码自己管理
缺点:
为了一点的功能可能要写很多代码,有点绕
AspectJ:
比较高级的,在编译期间/编辑后/加载期间对注解进行解读,把相应逻辑织入切点中,需要特定的编译器,如果是使用LWT类加载时候织入,那么就需要修改JVM启动参数。
优点:
- 因为不需要动态生成类,所以性能好,而且可以直接改变被代理类;
- 织入方式多种,可以编译时,编译后,LWT
- 可以使得你的代码不依赖容器类做代理,如果结合容器也有很厉害的能力,例如:可以在自己new的对象中,注入Spring管理的实例
- 有一套aj语法和切面逻辑语法,例如 @Pointcut("execution(* *..UserService.*(..))")
缺点:
被代理类不会保留副本,依赖AspectJ编译器;LWT方式的话以来修改启动参数;
JDK:
Java自带的代理实现,属于动态生成字节码类,所以是保存有原来的类的,可能因为严格遵守代理模式,所以只能代理带有接口的类,没有接口不能被代理
优点:
不依赖框架,只依赖JDK
缺点:
无法代理没有接口的类,需要手动获取代理类方法,需要封装一下,最好配合IOC
CGLib:
也是动态生成字节码,但是是通过继承的方式实现的,所以可以代理没有接口的类
优点:
可以代理没有接口的类
缺点:
不能代理final,static,private等方法