Aspectj入门

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值