SpringAop-1.AspectJ起步,
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方法执行后记录日志");
}
相关文章
- 暂无相关文章
用户点评