资讯专栏INFORMATION COLUMN

理解 Java AOP 《一》

GeekGhc / 2618人阅读

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

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
  • 看AspectJ在Android中的强势插入

    摘要:在上集成实际上是比较复杂的,不是一句话就能,但是,鄙司已经给大家把这个问题解决了,大家现在直接使用这个就可以很方便的在中使用了。使用案例目前鄙司的很多项目都已经使用了这套方案,例如基于的动态权限管理基于的业务数据埋点基于的性能监测系统等等。 什么是AOP AOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思...

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

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

    jk_v1 评论0 收藏0

发表评论

0条评论

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