欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

程序员文章站 2022-07-12 14:10:17
...

Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了)

https://blog.csdn.net/caomiao2006/article/details/47069171

AOP大家都不陌生,它是一种编程理念,一种规范,有很多的实现者如Spring AOP,JBoss AOP,还有我们今天要讲的AspectJ。我们平时项目用到最多的是Spring AOP,它是用纯Java实现的,不需要专门的编译过程,不需要特殊的类加载器,它在运行期通过JDK动态代理或者Cglib动态代理的方式向目标类织入增强代码。而AspectJ是语言级的AOP实现,它定义了自己的AOP语法和专门的编译期用来生成符合java字节码规范的class文件。

 

我们平时开发用的都是Eclipse,现在我们看下如何在Eclipse开发Aspectj代码。首先必须安装插件:AJDT,可以从这里挑选适合所有Eclipse版本的插件。比如我用的是4.4版本的eclipse:那我就选择AJDT 2.2.4版本的插件。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

解压后的结果如下:像安装其他Eclipse插件一样,将features和plugins下面的内容复制到Eclipse对应目录下,之后重启eclipse即可。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

因为我们AJDT插件已经安装成功,所以我们可以创建一个aspectj工程(跟普通的java工程没有什么区别)。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

编写普通的Main.java和MyService.java,代码如下:

 
  1. package net.aty.aspectj;

  2.  
  3. public class Main {

  4.  
  5. public static void main(String[] args) {

  6. System.out.println("main begin...");

  7. MyService service = new MyService();

  8. service.sayHello();

  9. System.out.println("main end...");

  10. }

  11. }

 
  1. package net.aty.aspectj;

  2.  
  3. public class MyService {

  4.  
  5. public void sayHello() {

  6. System.out.println("Hello World.");

  7. }

  8. }

 

 

现在我们建立一个aspectj文件,用来对MyService.sayHello()进行前置增强和后置增强。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

这跟建立一个java文件也是类似的,只不过差别在于java文件能被eclipse编译,而aspecj文件eclipse默认不认识。由于安装了AJDT插件,所以eclipse也能够编译aspect文件。HelloAspect.aj源码如下:

 
  1. package net.aty.aspectj;

  2.  
  3. public aspect HelloAspect {

  4.  
  5. pointcut HelloWorldPointCut() : execution(* net.aty.aspectj.MyService.*(..));

  6.  
  7. before() : HelloWorldPointCut(){

  8. System.out.println("begin intercept");

  9. }

  10.  
  11. after() : HelloWorldPointCut(){

  12. System.out.println("end intercept");

  13. }

  14. }


在eclipse中运行Main.java执行结果如下:可以看到成功地对目标类进行了增强。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World
 

我们的aspectj工程如下:这跟正常的java工程差别不大。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

使用AJDT插件能够极大地方便我们开发,让aspectj工程和.aj文件与普通的java工程和.java文件一致。代码还是上面的代码,现在我们看下如何在命令行自己编译.aj文件和运行,这跟在命令行使用javac和java命令很类似。为了使用javac和java,我们必须安装JRE(或JDK),同样地我们也需要安装Aspectj开发工具包。可以从这里下载。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

下载完成后运行aspectj-1.8.8.jar,就可以进行安装页面了。之后指定JRE位置下一步即可安装成功,很容易。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

最终安装成功后的结果如下:bin目录下提供了一些命令能够让我们自己编译.aj文件。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

项目结构如下:

javac文件夹:存放使用javac命令编译得到的class文件

aspectj文件夹:存放使用ajc命令编译得到的class文件

use_aspectj_compile.bat:使用ajc将java文件和aj文件编译到aspectj文件夹

use_javac_compile.bat:使用javac命令将java文件(javac命令是不认识aj文件的)编译到javac文件夹

run.bat:调用use_aspectj_compile.bat和use_javac_compile.bat,并执行编译后得到的class文件。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

注意:这3个bat文件是必需的,javac和aspectj文件夹会自动创建。

 

use_javac_compile.bat内容如下:

 
  1. @echo off

  2.  
  3. rem get the directory of current bat file.

  4. set "CURRENT_DIR=%cd%"

  5. echo current directory is: %CURRENT_DIR%

  6.  
  7.  
  8. rem remove exist temp file.

  9. set "srclist=srclist.txt"

  10. if exist %srclist% (

  11. del %srclist%

  12. )

  13.  
  14. rem show all .java files

  15. echo all java files are:

  16. for /R %CURRENT_DIR%/src %%s in (*.java) do (

  17. echo %%s

  18. echo %%s >> %srclist%

  19. )

  20.  
  21. set "class_dir=javac"

  22. if exist %class_dir% (

  23. rd /s/q %class_dir%

  24. )

  25.  
  26. mkdir %class_dir%

  27.  
  28. rem use javac to compile all java files.

  29. javac -d %class_dir% @%srclist%

 

 

use_aspectj_compile.bat内容如下:

 
  1. @echo off

  2.  
  3. set "CURRENT_DIR=%cd%"

  4. echo current directory is: %CURRENT_DIR%

  5.  
  6. rem remove exist temp file.

  7. set "srclist=srclist.txt"

  8. if exist %srclist% (

  9. del %srclist%

  10. )

  11.  
  12. echo all java files are:

  13. for /R %CURRENT_DIR%/src %%s in (*.java *.aj) do (

  14. echo %%s

  15. echo %%s >> %srclist%

  16. )

  17.  
  18. set "class_dir=aspectj"

  19. if exist %class_dir% (

  20. rd /s/q %class_dir%

  21. )

  22.  
  23. mkdir %class_dir%

  24.  
  25. rem use javac to compile all java files.

  26. ajc -d %class_dir% -classpath C:/aspectj1.8/lib/aspectjrt.jar @%srclist%

 

run.bat内容如下:

 
  1. @echo off

  2.  
  3. echo use aspectj to compile...

  4. call use_aspectj_compile.bat

  5. echo use aspectj compile success...

  6.  
  7. echo=

  8.  
  9. echo use javac to compile...

  10. call use_javac_compile.bat

  11. echo use javac compile success...

  12.  
  13. echo=

  14.  
  15. echo run classes(use javac to compile)...

  16. java -classpath javac net.aty.aspectj.Main

  17. echo=

  18.  
  19. echo run classes(use aspectj to compile)...

  20. java -classpath aspectj;"C:/aspectj1.8/lib/aspectjrt.jar" net.aty.aspectj.Main

 

 

我们执行run.bat运行结果如下:可以看到使用ajc编译后的class文件被增强了,而使用javac则并没有。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World

 

使用aspectj的ajc命令会编译出:HelloAspect.class和MyService.class,我们可以使用反编译工具jd-gui查看代码。可以看出MyService被增强了。

【AOP 的实现之Aspectj(一)】:AspectJ开发环境搭建与Hello World