欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

SpringAop-1.AspectJ起步,

来源: javaer 分享于  点击 34042 次 点评:22

SpringAop-1.AspectJ起步,


1.aspectJ编译运行的命令与java类似:(cmd可运行)

  aspectJ文件已.aj或.java保存均可

         java                        |                 aspectJ

编译      javac -d . Xxx.java(*.java)           |            ajc -d .  Xxx.aj(Xxx.java)           
运行                                              java package.Xxx


2.aspectJ示例

两个方法类:(Hello.java World.java)

package codeEETest;
public class Hello
{
	// 定义一个简单方法,模拟应用中的业务逻辑方法
	public void foo()
	{
		System.out.println("执行Hello组件的foo()方法");
	}
	// 定义一个addUser()方法,模拟应用中的添加用户的方法
	public int addUser(String name , String pass)
	{
		System.out.println("执行Hello组件的addUser添加用户:" + name);
		return 20;
	}
}
package codeEETest;
public class World
{
	// 定义一个简单方法,模拟应用中的业务逻辑方法
	public void bar()
	{
		System.out.println("执行World组件的bar()方法");
	}
}

切面(AuthAspect.aj)

package codeEETest;
public aspect AuthAspect
{
	// 指定在执行...包中任意类的、任意方法之前执行下面代码块
	// 第一个星号表示返回值不限;第二个星号表示类名不限;
	// 第三个星号表示方法名不限;圆括号中..代表任意个数、类型不限的形参
	before(): execution(* codeEETest.*.*(..))
	{
		System.out.println("模拟进行权限检查...");
	}
}

测试:

package codeEETest;
public class AspectJTest
{
	public static void main(String[] args)      //方法1
	{
		Hello hello = new Hello();
		hello.foo();                        //方法2
		hello.addUser("孙悟空" , "7788");
		World world = new World();
		world.bar();                        //方法3
	}
}
说明:上边的切面表达式表示执行该包下的任意方法都会先执行权限检查。

模拟进行权限检查...                //mian方法前的检查
模拟进行权限检查...                //foo方法前
执行Hello组件的foo()方法
模拟进行权限检查...                //addUser方法前
执行Hello组件的addUser添加用户:孙悟空
模拟进行权限检查...                //bar方法前
执行World组件的bar()方法

3.AspectJ的说明

编写AspectJ类,注意关键字为aspect(MyAspectJDemo.aj,其中aj为AspectJ的后缀),含义与class相同,即定义一个AspectJ的类

/**
 * Created by zejian on 2017/2/15.
 * Blog : http://blog.csdn.net/javazejian [原文地址,请尊重原创]
 * 切面类
 */
public aspect MyAspectJDemo {
    /**
     * 定义切点,日志记录切点
     */
    pointcut recordLog():call(* HelloWord.sayHello(..));

    /**
     * 定义切点,权限验证(实际开发中日志和权限一般会放在不同的切面中,这里仅为方便演示)
     */
    pointcut authCheck():call(* HelloWord.sayHello(..));

    /**
     * 定义前置通知!
     */
    before():authCheck(){
        System.out.println("sayHello方法执行前验证权限");
    }

    /**
     * 定义后置通知
     */
    after():recordLog(){
        System.out.println("sayHello方法执行后记录日志");
    }
}

    AspectJ是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器),可以这样说AspectJ是目前实现AOP框架中最成熟,功能最丰富的语言,更幸运的是,AspectJ与java程序完全兼容,几乎是无缝关联,因此对于有java编程基础的工程师,上手和使用都非常容易。

    在案例中,我们使用aspect关键字定义了一个类,这个类就是一个切面,它可以是单独的日志切面(功能),也可以是权限切面或者其他,在切面内部使用了pointcut定义了两个切点,一个用于权限验证,一个用于日志记录,而所谓的切点就是那些需要应用切面的方法,如需要在sayHello方法执行前后进行权限验证和日志记录,那么就需要捕捉该方法,而pointcut就是定义这些需要捕捉的方法(常常是不止一个方法的),这些方法也称为目标方法,最后还定义了两个通知(advise,增强处理),通知就是那些需要在目标方法前后执行的函数,如before()即前置通知在目标方法之前执行,即在sayHello()方法执行前进行权限验证,另一个是after()即后置通知,在sayHello()之后执行,如进行日志记录。到这里也就可以确定,切面就是切点通知的组合体,组成一个单独的结构供后续使用。


AOP的作用:

    开发者无需修改源代码,又可以为组件的方法添加新的功能。

   http://blog.csdn.net/javazejian/article/details/56267036点击打开链接


AOP术语:

(1)切面 (Aspect):组织多个Advise

(2)连接点 (Joinpoint):方法的调用或异常的抛出,Spring AOP中总是方法的调用

(3)增强处理/通知 (Advise):见下文。

(4)切入点 (Pointcut):可以插入增强处理的连接点。即当连接点被添加增强处理,连接点就变成了切入点。

         切入点表达式是AOP核心。Spring模式使用AspectJ风格的表达式。


(5)目标对象:被增强处理的对象。

(6)AOP代理:代理就是目标对象的加强。Spring AOP代理可以是JDK动态代理,也可以是cglib代理。AspectJ是静态AOP代理(.class文件会被改掉)。

(7)织入(weaving):将增强处理添加到目标对象中。织入的两种方式:编译时增强(如:AspectJ)和运行时增强(纯javaAOP,如Spring AOP)。


AOP代理就是由AOP框架动态生成一个对象,该对象作为目标对象使用,包含了目标对象的全部方法。AOP方法在特定的切入点添加增强处理,并回调目标方法的对象。


AOP代理的方法:

AOP框架织入的增强处理---->回调目标对象的方法---->AOP框架织入的增强处理


术语详解:

(1)Pointcut,定义切点,后面跟着函数名称,最后编写匹配表达式,此时函数一般使用call()或者execution()进行匹配,这里我们统一使用call()

pointcut recordLog():call(* HelloWord.sayHello(..));
(2)Advise 有5种类型分别如下:

  • before 目标方法执行前执行,前置通知
  • after 目标方法执行后执行,后置通知
  • after returning 目标方法返回时执行 ,后置返回通知
  • after throwing 目标方法抛出异常时执行 异常通知
  • around 在目标函数执行中执行,可控制目标函数是否执行,环绕通知
 after():recordLog(){
     System.out.println("sayHello方法执行后记录日志");
 }


相关文章

    暂无相关文章
相关栏目:

用户点评