AOP:基于AspectJ编码简单示例

简介:

 一、基本概念

  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插件http://www.eclipse.org/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);
	}

}


目录
相关文章
|
XML Java 数据格式
Spring中使用AspectJ实现AOP的五种通知
Spring中使用AspectJ实现AOP的五种通知
202 1
Spring中使用AspectJ实现AOP的五种通知
|
Java Spring
11Spring - 基于AspectJ的AOP开发(注解的方式)
11Spring - 基于AspectJ的AOP开发(注解的方式)
52 0
|
XML Java 数据格式
10Spring - 基于AspectJ的AOP开发 (XML的方式)
10Spring - 基于AspectJ的AOP开发 (XML的方式)
51 0
|
2月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
106 2
|
4月前
|
XML Java 数据库
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
|
5月前
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
6月前
|
Java 编译器 Maven
Java一分钟之-AspectJ:AOP库
【6月更文挑战第13天】AspectJ是Java的AOP框架,扩展了语言并提供编译时和加载时织入,便于模块化横切关注点。关键概念包括编织、切面、切点和通知。常见问题涉及编译时织入配置、切点表达式误用、异常处理和版本兼容性。通过正确配置构建工具、精准设计切点、妥善处理异常和确保版本兼容,可避免这些问题。文中还提供了一个记录服务层方法执行时间的代码示例,帮助读者快速上手AspectJ。
214 2
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
9925 3
|
7月前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
79 5
|
7月前
|
Java
SpringBoot整合AOP整合aspectj实现面向切面编程实现参数接收和请求时间打印
SpringBoot整合AOP整合aspectj实现面向切面编程实现参数接收和请求时间打印
37 0