spring中aop实现机制(每天3分钟-快速掌握spring)
- 去官网下载aspectj的jar包,关注下自己使用的jdk的版本
https://www.eclipse.org/aspectj/downloads.php
- 下载成功以后,执行命令
Java -jar aspectj-1.8.14.jar
- 会弹出安装界面
- 安装成功以后,还需要添加环境变量,以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,确定下是否安装成功,成功的话会提示相应的版本
- 首先编写一个简单的 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 框架。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com