1、概述:
aspectj执行速度快,那是因为是静态代理——aspectj在编译阶段产生符合java规范的字节码文件(已经织入通知),就是class文件。aspectj定义了自己的AOP语法和专门的编译器
aspectj官网:http://www.eclipse.org/aspectj/
2、aspectj的eclipse插件ajdt安装
aspectj的eclipse插件下载地址:http://www.eclipse.org/ajdt/downloads/index.php
在页面选择与eclipse版本相应的下载,我下载的是下面的版本:
插件安装好后,eclipse中可以新建aspectj项目:
3、创建Aspecj Project,体验aspectj
下面我们新建一个demo——helloworld体验一下,下面不是普通的java项目,是一个aspectj项目(要安装了aspectj插件才能新建aspectj项目)
整体代码:
要拦截方法定义在Hello文件中,Hello文件如下:
package com.java.aspectj;
public class Hello {
public void hello(String name) {
System.out.println(name+",hello!");
}
}
定义aspectj文件,HelloWorld.aj:
package com.java.aspectj;
public aspect HelloWorld {
/**
* 第一个*号是指返回值不限,第二个*号是指方法名不限
* 括号只是任意个数类型不限的形参
*/
before() : execution(* com.java.aspectj.Hello.*(..)) {
System.out.println("hello前的检查");
}
after() : execution(* com.java.aspectj.Hello.*(..)) {
System.out.println("hello后的检查");
}
}
aspectj文件怎么编写可以参考文档:http://www.eclipse.org/aspectj/doc/released/progguide/quick.html
aspectj官方文档:http://www.eclipse.org/aspectj/doc/released/progguide/index.html
由aspectj编译生成的class文件,反编译如下,
HelloWorld.class
package com.java.aspectj;
import java.io.PrintStream;
import org.aspectj.lang.NoAspectBoundException;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class HelloWorld
{
public static HelloWorld aspectOf()
{
if (ajc$perSingletonInstance == null) {
throw new NoAspectBoundException("com_java_aspectj_HelloWorld", ajc$initFailureCause);
}
return ajc$perSingletonInstance;
}
public static boolean hasAspect()
{
return ajc$perSingletonInstance != null;
}
static
{
try
{
}
catch (Throwable localThrowable)
{
ajc$initFailureCause = localThrowable;
}
}
@Before(value="call(* com.java.aspectj.*.*(..))", argNames="")
public void ajc$before$com_java_aspectj_HelloWorld$1$4be4d41d()
{
System.out.println("hello前的检查");
}
@After(value="call(* com.java.aspectj.*.*(..))", argNames="")
public void ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d()
{
System.out.println("hello后的检查");
}
}
Test.class
package com.java.aspectj;
import java.io.PrintStream;
public class Test
{
public static void main(String[] args)
{
System.out.println("main ");
Hello hello = new Hello();
try
{
HelloWorld.aspectOf().ajc$before$com_java_aspectj_HelloWorld$1$4be4d41d();hello.hello("张三");
}
catch (Throwable localThrowable)
{
HelloWorld.aspectOf().ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d();throw localThrowable;
}
HelloWorld.aspectOf().ajc$after$com_java_aspectj_HelloWorld$2$4be4d41d();
System.out.println("main ");
}
}
aspectj编译生成的class文件,已经在方法前后添加了通知。
4、总结:工作当中从来没见过aspectj project项目,也没见过*.aj文件。所以这个是体验aspectj的,有助于理解aop