• 【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等方法

  • 相关阅读:
    Lintcode423-Valid Parentheses-Easy
    Lintcode97-Maximum Depth of Binary Tree-Easy
    Lintcode175-Revert Binary Tree-Easy
    Lintcode469-Same Tree-Easy
    Leetcode480-Binary Tree Paths-Easy
    Lintcode481-Binary Tree Leaf Sum-Easy
    Lintcode482-Binary Tree Level Sum-Easy
    Lintcode376-Binary Tree Path Sum-Easy
    SQL
    Database
  • 原文地址:https://www.cnblogs.com/iCanhua/p/12865178.html
Copyright © 2020-2023  润新知