博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOP:基于AspectJ编码简单示例
阅读量:5998 次
发布时间:2019-06-20

本文共 3190 字,大约阅读时间需要 10 分钟。

hot3.png

 一、基本概念

  AspectJ 是一种面向切面程序设计的基于 Java 的实现。它向 Java 中加入了连接点(Join Point)这个新概念,其实它也只是现存的一个 Java概念的名称而已。它向 Java 语言中加入少许新结构:切点(pointcut)、通知(Advice)、类型间声明(Inter-type declaration)和方面(Aspect)。切点和通知动态地影响程序流程,类型间声明则是静态的影响程序的类等级结构,而切面则是对所有这些新结构的封装。

    基于切面、连接点、切点、通知的概念如下:

  • Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

  连接点是程序流中适当的一点。切点收集特定的连接点集合和在这些点中的值。一个通知是当一个连接点到达时执行的代码,这些都是 AspectJ的动态部分。其实连接点就好比是程序中的一条一条的语句,而切点就是特定一条语句处设置的一个断点,它收集了断点处程序栈的信息,而通知就是在这个断点前后想要加入的程序代。AspectJ 中也有许多不同种类的类型间声明, 这就允许程序员修改程序的静态结构、 名称、 类的成员以及类之间的关系。AspectJ 中的方面是横切关注点的模块单元。它们的行为与 Java语言中的类很象,但是方面还封装了切点、通知以及类型间声明

二、如何基于AJDT: AspectJ Development Tools进行AOP程序的开发?

  1. 按照ajdt网站上的说明,在eclipse中安装ajdt插件  ajdt - http://download.eclipse.org/tools/ajdt/43/update
  2. 创建AspectJ Project项目
  3. 进行代码开发(本文提供一个简单的示例)

三、简单示例:

package aop.test;public interface FigureElement {	public void setXY(int x,int y);	public void draw();}

package aop.test;public class Point implements FigureElement {		public int x;	private int y;		public int getX() {		return x;	}	public String setX(int x) {		System.out.println("设置x值:x="+x);		this.x = x;		return "返回值是x="+x;	}	public int getY() {		return y;	}	public void setY(int y) {		this.y = y;	}		public Point(){			}		public Point(int x,int y){		this.x=x;		this.y=y;	}	@Override	public void setXY(int x,int y) {		this.x=x;		this.y=y;		System.out.println("Point setXY: x="+x+",y="+y);	}	@Override	public void draw() {		System.out.println("Point draw");		}	@Override	public String toString(){		return "Point: x="+x+",y="+y;	}}

package aop.test;public aspect TestMain {	/**	 * 不带参数的pointcut	 */	pointcut psimple() : call(void Point.*(int));	before() : psimple() {		System.out.println("psimpe执行前调用");	}	after() returning() : psimple() {		System.out.println("psimple执行后调用");	}	/**	 * 带参数的pointcut	 * 	 * @param i	 */	pointcut psetX(int i) : call(String Point.setX(int)) && args(i);	before(int i) : psetX(i) {		System.out.println("psetX执行前调用" + i);	}	after(int i) returning(String sReturn) : psetX(i) {		System.out.println("psetX执行后调用" + i + ":" + sReturn);	}	/**	 * 带多个参数的pointcut	 * 	 * @param fe	 * @param x	 * @param y	 */	pointcut psetXY(FigureElement fe, int x, int y) : 		call(void FigureElement.setXY(int,int))		&& target(fe)		&& args(x,y);	//	before(FigureElement fe, int x, int y) : psetXY(fe,x,y) {//		System.out.println("psetXY before" + fe + " move to x=" + x + ",y=" + y);//	}		after(FigureElement fe, int x, int y) returning() : psetXY(fe,x,y) {		System.out.println("psetXY after" + fe + " move to x=" + x + ",y=" + y);	}	before(FigureElement fe, int x, int y) : 		call(void FigureElement.setXY(int,int))		&& target(fe)		&& args(x,y) {		System.out.println("psetXY before" + fe + " move to x=" + x + ",y=" + y);	}	public static void main(String[] args) {		Point p1 = new Point();		p1.setY(2);		p1.setX(2);		Point p2 = new Point(2, 2);		p2.setXY(2, 3);	}}

   

转载于:https://my.oschina.net/cloudcoder/blog/189860

你可能感兴趣的文章
[android] 练习viewpagerindicator的使用(一)
查看>>
Linux每次开机都要source profile的解决办法
查看>>
SQL数据库注入防范 ASP.NET Globle警告
查看>>
手机号获取验证码、验证验证码是否正确
查看>>
CentOS7离线安装mysql5.6
查看>>
WebConfig常用配置文件
查看>>
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
Data guard RAC配置【二】
查看>>
Java下的框架编程(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)
查看>>
初级 Web 开发人员的 Tomcat
查看>>
文件已删除但句柄没有释放导致磁盘空间用完
查看>>
vue指令之v-bind
查看>>
【Unity3D技术文档翻译】第1.5篇 本地使用 AssetBundles
查看>>
MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第二部分)——IOrganizationService(四)...
查看>>
C#中float, double的精度问题
查看>>
CSS常用属性
查看>>
AVFoundation 文本播报
查看>>
UIToolBar
查看>>
加密算法:对称加密和非对称加密
查看>>
分布式锁原理及实现(转)
查看>>