- AspectJ 传统语法概要
如果说OOP的出现是把编码问题进行模块化,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。
AspectJ
Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
切入点(pointcut)和通知(advice)
/*** 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(参数):连接点函数{* 函数体* }*/before():authCheck(){System.out.println("sayHello方法执行前验证权限");}/*** 定义后置通知* after(参数):连接点函数{* 函数体* }*/after():recordLog(){System.out.println("sayHello方法执行后记录日志");}/*** 定义后置通知带返回值* after(参数)returning(返回值类型):连接点函数{* 函数体* }*/after()returning(int x): get(){System.out.println("返回值为:"+x);}/*** 异常通知* after(参数) throwing(返回值类型):连接点函数{* 函数体* }*/after() throwing(Exception e):sayHello2(){System.out.println("抛出异常:"+e.toString());}/*** 环绕通知 可通过proceed()控制目标函数是否执行* Object around(参数):连接点函数{* 函数体* Object result=proceed();//执行目标函数* return result;* }*/Object around():aroundAdvice(){System.out.println("sayAround 执行前执行");Object result=proceed();//执行目标函数System.out.println("sayAround 执行后执行");return result;} /*** 定义前置通知!*/before():authCheck(){System.out.println("sayHello方法执行前验证权限");}/*** 定义后置通知*/after():recordLog(){System.out.println("sayHello方法执行后记录日志");}}
案例:recordLog()是函数名称,自定义的,* 表示任意返回值,接着就是需要拦截的目标函数,sayHello(..)的..,表示任意参数类型
pointcut recordLog():call(* HelloWord.sayHello(..));
- 热插拔特性
- 如果说OOP的出现是把编码问题进行模块化,那么AOP就是把涉及到众多模块的某一类问题进行统一管理
- javac和ajc编译器都是编译成字节码文件
Spring AOP and AspectJ weaving
Does Spring @Transactional attribute work on a private method?

