【AOP代理】最强王者—AspectJ

前言:

  AOP是目前编程最核心的理念之一,Spring的核心可以用两个专用词汇解析,1、IOC,2、AOP;可见AOP的重要性,Java中的实现方式有几种:

  静态代理

  1. 设计模式例子,手写
  2. AspectJ,编译器织入的方式(也可以在编译后织入,以及在加载时候织入,如LWT);

  动态代理

  1. JDK代理
  2. CGLib代理

  以上实现方式网上很多资料,可以参考一些官网api doc;本文简单探讨下几种实现方式的优缺点,结合应用,说下哪个功能最强大

概念:

  Spring中定义的一些代理的概念,切点,切面,连接点,引入增强等,其实都是来着AspectJ,AspectJ是Java届AOP的事实标准了。

  // TODO介绍下

设计模式:

  设计模式有一章是专门介绍代理模式的,我们可以简单的手写一个代理类,也是我们的入门基础了;

  优点

  完全不依赖框架,可以自己代码自己管理

  缺点

  为了一点的功能可能要写很多代码,有点绕

AspectJ:

  比较高级的,在编译期间/编辑后/加载期间对注解进行解读,把相应逻辑织入切点中,需要特定的编译器,如果是使用LWT类加载时候织入,那么就需要修改JVM启动参数。

  优点

  1. 因为不需要动态生成类,所以性能好,而且可以直接改变被代理类;
  2. 织入方式多种,可以编译时,编译后,LWT
  3. 可以使得你的代码不依赖容器类做代理,如果结合容器也有很厉害的能力,例如:可以在自己new的对象中,注入Spring管理的实例
  4. 有一套aj语法和切面逻辑语法,例如 @Pointcut("execution(* *..UserService.*(..))")

  缺点

  被代理类不会保留副本,依赖AspectJ编译器;LWT方式的话以来修改启动参数;

JDK:

  Java自带的代理实现,属于动态生成字节码类,所以是保存有原来的类的,可能因为严格遵守代理模式,所以只能代理带有接口的类,没有接口不能被代理

  优点

  不依赖框架,只依赖JDK

  缺点

  无法代理没有接口的类,需要手动获取代理类方法,需要封装一下,最好配合IOC

CGLib:

  也是动态生成字节码,但是是通过继承的方式实现的,所以可以代理没有接口的类

  优点

  可以代理没有接口的类

  缺点

  不能代理final,static,private等方法

原文地址:https://www.cnblogs.com/iCanhua/p/12865178.html