AspectJ(一)简介
来源:互联网 发布:淘宝刷单价格 编辑:程序博客网 时间:2024/05/17 01:23
AOP是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和Java 配合起来使用。
Aspectj是什么
“a seamless aspect-oriented extension to the Javatm programminglanguage”(一种基于Java平台的面向切面编程的语言)。Aspectj能做什么干净的模块化横切关注点(也就是说单纯,基本上无侵入),如错误检查和处理,同步,上下文敏感的行为,性能优化,监控和记录,调试支持,多目标的协议。
常用的Aop
Jboss Aop、Spring Aop
Spring Aop:Spring自己原生的Aop,只能用一个词来形容:难用。你需要实现大量的接口,继承大量的类,所以spring aop一度被千夫所指。这于他的无侵入,低耦合完全冲突。不过Spring对开源的优秀框架,组建向来是采用兼容,并入的态度。所以,后来的Spring就提供了Aspectj支持,也就是我们后来所说的基于纯POJO的Aop。
与AspectJ的区别:Spring Aop采用的动态织入,而Aspectj是静态织入。静态织入:指在编译时期就织入,即:编译出来的class文件,字节码就已经被织入了。动态织入又分静动两种,静则指织入过程只在第一次调用时执行;动则指根据代码动态运行的中间状态来决定如何操作,每次调用Target的时候都执行。
Aop术语
Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Jointpoint:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的Advice 将要发生的地方。
Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around来区别是在每个 joint point 之前、之后还是代替执行的代码。
简单Demo
HelloWorld.java
public class HelloWorld { public static void main(int i){ System.out.println("int the main method i = " + i); } public static void main(String[] args) { main(5); } }
切面:
HelloAspect.aj
public aspect HelloAspect { pointcut HelloWorldPointCut() : execution(* main(int)) && !within(HelloWorld); before() : HelloWorldPointCut(){ System.out.println("Entering : " + thisJoinPoint.getSourceLocation()); } }
运行结果:
总结:
AOP并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,并且使得系统更加健壮,可维护性更好。同时,它让我们在进行系统架构和模块设计的时候多了新的选择和新的思路,AspectJ帮我们实现了这些。
- AspectJ(一)简介
- aspectj简介
- 跟我学AspectJ(一)
- 跟我学AspectJ(一)
- 跟我学AspectJ(一)
- Android AOP 之AspectJ(一)
- (转)AspectJ简介
- aspectj之一 ----- 简介
- spring的aspectj简介
- springAOP之aspectJ(一)
- 一、AspectJ概论
- Aspectj简单使用(一)
- AspectJ实现设计模式(一)——观察者模式
- SpringAOP入门学习一:基于注解配置切面( AspectJ)
- 跟我学aspectj之一 ----- 简介
- 跟我学aspectj之一 ----- 简介
- AndroidStudio中 AspectJ 基础使用 简介
- 静态实现(AspectJ)
- java二维码生成与解析代码实现
- ubuntu14.04.4安装libpcap 1.6.2
- Net大型系统间调用的问题
- 关于一个GC回收内存总量的疑问
- Activity 启动模式
- AspectJ(一)简介
- curl-7.37.1在AIX上编译失败“cc: 1501-230 内部编译器错误;请与您的服务代表联系”
- (hdu step 3.3.1)Big Event in HDU(01背包:N件物品放在容量为V的背包中,第i件物品的费用是c[i],价值是w[i]。问所能获取的最大价值)
- android 高速模拟器 genymotion
- 【重装系统】Raspberry B+上手教程--自己梳理,亲测有效
- 编译链接错误及解决方法记录
- JAVA中int、String的类型转换
- J2SE_通过反射能获取方法参数名称吗?
- js replace 字符串替换