资讯专栏INFORMATION COLUMN

理解 Java AOP 《一》

GeekGhc / 2721人阅读

摘要:扩展了语言,定义了语法,所以它有一个专门的编译器用来生成遵守字节码规范的文件注意此,非。只是提供了和语法一致的语义注解,两者是完全不同的实现。修改类运行时,在内通过转换类的字节码,把横切逻辑织入到目标类中。

AOP概述

AOP(Aspect-Oriented Programming,面向切面的编程)是一种编程范式,专注于解耦业务逻辑和横切逻辑,从而达到提升内聚和模块化的目的。

业务逻辑 :处理业务的逻辑。

横切逻辑 :通常固定的出现在业务逻辑的边界处,在进入业务逻辑前或执行业务逻辑后做一些事情。

看一个例子:

横切逻辑

public class PerformanceMonitor {

    public void start() {
        System.out.println("开始时间: " + String.valueOf(System.currentTimeMillis()));
    }

    public void end() {
        System.out.println("结束时间: " + String.valueOf(System.currentTimeMillis()));
    }
}

业务逻辑

public class Biz {

    private PerformanceMonitor pMonitor = new PerformanceMonitor();

    public void doSomething() {
        pMonitor.start();
        System.out.println("做一些业务逻辑");
        pMonitor.end();
    }

    public static void main(String [] args) {
        Biz biz = new Biz();
        biz.doSomething();
    }
}

上面例子中,我们希望通过PerformanceMonitor打印业务执行开始和结束时间,乍眼一看似乎没毛病。

那问题来了,如果我希望:

在调试阶段才打印开始和结束时间,应用发布后不打印。

希望在其他业务逻辑开始和结束的时候也打印时间。

按照现在的处理方式,业务逻辑和横切逻辑耦合在了一起,需要满足上述需求的话,需要修改代码后再重新编译,显然这种处理方式不够优美。

AOP就是一种优美的处理方式,如下:

Java AOP的实现方式

Java中实现AOP的方式分 静态AOP动态AOP 两大类,下面分别列举。

静态AOP

在编译期间,横切逻辑直接以字节码形式编译到业务逻辑的字节码文件中,通常需要特殊的编译器。

Aspectj

Aspectj扩展了java语言,定义了AOP语法,所以它有一个专门的编译器(ajc)用来生成遵守Java字节码规范的Class文件

注意 : 此Aspectj,非Spring Aspectj。Spring Aspectj只是提供了和Aspectj AOP语法一致的语义注解,两者是完全不同的实现。

动态AOP

在运行期间,通过修改目标类的字节码、生成类的子类或代理类织入横切逻辑。

生成接口代理类(JDK动态代理)

运行时,通过为目标类实现的接口动态生成代理类,把横切逻辑织入到代理类中。

生成子类

运行时,通过为目标类生成子类,把横切逻辑织入到子类中。

自定义 ClassLoader(修改类)

运行时,在类加载器加载类的时候,修改目标类的字节码,把横切逻辑织入到目标类中。

ClassFileTransformer(修改类)

运行时,在Java Agent内通过Instrumentation转换类的字节码,把横切逻辑织入到目标类中。

AOP方式比较
AOP方式 效率 实现接口 final method 其他特点
Aspectj 编译效率低,运行效率高 不需要 支持 -
JDK动态代理 生成代理效率高,执行效率低 需要 N/A 通过反射方式调业务逻辑
生成子类 生成子类效率低,执行效率高 不需要 不支持 -
自定义 ClassLoader 加载效率低,执行效率高 不需要 支持 只能对自动义类加载器加载的类织入
ClassFileTransformer 加载效率低,执行效率高 不需要 支持 对所有类织入

PS :未完待续,后续章节针对每一种AOP方式举例,实现PerformanceMonitor横切逻辑的织入。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67436.html

相关文章

  • Spring AOP就是这么简单啦

    摘要:是一种特殊的增强切面切面由切点和增强通知组成,它既包括了横切逻辑的定义也包括了连接点的定义。实际上,一个的实现被拆分到多个类中在中声明切面我们知道注解很方便,但是,要想使用注解的方式使用就必须要有源码因为我们要 前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知...

    Jacendfeng 评论0 收藏0
  • 从源码入手,文带你读懂Spring AOP面向切面编程

    摘要:,,面向切面编程。,切点,切面匹配连接点的点,一般与切点表达式相关,就是切面如何切点。例子中,注解就是切点表达式,匹配对应的连接点,通知,指在切面的某个特定的连接点上执行的动作。,织入,将作用在的过程。因为源码都是英文写的。 之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下...

    wawor4827 评论0 收藏0
  • Spring框架学习笔记():官方文档介绍,IoC与AOP概念学习

    摘要:构造函数注入通过调用类的构造函数,将接口实现类通过构造函数变量传入。而在中,其使用横切技术,将这类代码从原属的封装对象中提取出来,封装到一个可重用模块中,称为。 最近实习用到Spring的开发框架,但是之前没有接触过,因此希望利用网上的资源来学习以下。 Spring官方给出了非常全面的介绍,非常适合我这种完全的小白……在这一系列学习中,我阅读的主要资源是5.1.2 Reference ...

    mindwind 评论0 收藏0
  • Java 代理模式与 AOP

    摘要:本文首发于作者最近在学,研究了下和代理模式,写点心得和大家分享下。所以下面来重点分析下代理模式。这里代理模式分为静态代理和动态代理两种,我们分别来看下。代理模式,代理,意味着有一方代替另一方完成一件事。 本文首发于 https://jaychen.cc作者 jaychen 最近在学 Spring,研究了下 AOP 和代理模式,写点心得和大家分享下。 AOP 先说下AOP,AOP 全称 ...

    jk_v1 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<