spring中aop实现机制(每天3分钟-快速掌握spring)

  • 去官网下载aspectj的jar包,关注下自己使用的jdk的版本

https://www.eclipse.org/aspectj/downloads.php

  • 下载成功以后,执行命令

Java -jar aspectj-1.8.14.jar

  • 会弹出安装界面

spring中aop实现机制(每天3分钟-快速掌握spring)(1)

  • 安装成功以后,还需要添加环境变量,以mac为例

vim ./.bash_profile export PATH=${java_HOME}/bin:$PATH:/Users/local/aspectj1.8/bin export CLASSPATH=${CLASSPATH}:/Users/local/aspectj1.8/lib/aspectjrt.jar source ./.bash_profile

  • 配置完成后,输入命令ajc,确定下是否安装成功,成功的话会提示相应的版本

spring中aop实现机制(每天3分钟-快速掌握spring)(2)

  • 首先编写一个简单的 Java 类,这个 Java 类用于模拟一个业务组件

public class Hello { public void sayHello() { System.out.println("Hello, AspectJ!"); } public static void main(String[] args) { Hello hello = new Hello(); hello.sayHello(); } }

  • 假设现在客户需要在执行 sayHello() 方法之前启动事务,当该方法执行结束时关闭事务,在传统编程模式下,我们必须手动修改 sayHello() 方法
  • 如果改为使用 AspectJ,则可以无须修改上面的 sayHello() 方法,使用AspectJ来创建一个特殊的类

public aspect TxAspect { void around():call(void Hello.sayHello()){ System.out.println("开始事务..."); proceed(); System.out.println("事务结束..."); } }

  • TxAspect 不是一个 Java 类, aspect 也不是 Java 支持的关键字,它只是 AspectJ 才能识别的关键字,上面的代码中 proceed() 代表回调原来的 sayHello() 方法
  • 接下来执行如下命令进行编译:

ajc -d . Hello.java TxAspect.aj

  • 然后会输出结果

开始事务... Hello AspectJ! 事务结束...

  • 从上面运行结果来看,我们完全可以不对 Hello.java 类进行任何修改,同时又可以满足客户的需求,上面程序只是在控制台打印”开始事务 …”、”结束事务 …”来模拟了事务操作,实际上我们可用实际的事务操作代码来代替这两行简单的语句,这就可以满足客户需求了
  • 通过使用 AspectJ 提供的 AOP 支持,我们可以为 sayHello() 方法不断增加新功能。
  • 为什么在对 Hello 类没有任何修改的前提下,而 Hello 类能不断地、动态增加新功能,这看上去并不符合 Java 基本语法规则啊。实际上我们可以使用 Java 的反编译工具来反编译前面程序生成的 Hello.class 文件,发现 Hello.class 文件的代码如下:

import org.aspectj.runtime.internal.AroundClosure; public class Hello { public Hello() { } public void sayHello() { System.out.println("Hello, AspectJ!"); } public static void main(String[] args) { Hello hello = new Hello(); sayHello_aroundBody1$advice(hello, TxAspect.aspectOf(), (AroundClosure)null); } }

  • 该 Hello.class 里新增了很多内容,这表明 AspectJ 在编译时”自动”编译得到了一个新类,这个新类增强了原有的 Hello.java 类的功能,因此 AspectJ 通常被称为编译时增强的 AOP 框架。
都看到这了,你是最棒的

spring中aop实现机制(每天3分钟-快速掌握spring)(3)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页