文档章节

AOP:基于AspectJ编码简单示例

cloud-coder
 cloud-coder
发布于 2014/01/03 15:43
字数 1051
阅读 432
收藏 6
点赞 0
评论 0

 一、基本概念

  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);
	}

}



   

© 著作权归作者所有

共有 人打赏支持
cloud-coder
粉丝 243
博文 189
码字总数 135000
作品 0
广州
架构师
2014-03-11 Spring的学习(3)------面向切面编程(AOP)

AOP概念 首先让我们从一些重要的AOP概念和术语开始。这些术语不是Spring特有的。不过AOP术语并不是特别的直观,如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect):一个关注...

查封炉台
2014/03/11
0
0
Aspectj与Spring AOP比较

1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 是否与用户现有的或新的应用程序兼容? 在哪里可以实现 AOP? 与自己的应用程序集成多快? 性能开销是多少? 在本文中, 我们将...

沈渊
04/18
0
0
使用Spring进行面向切面编程(AOP)

转载于http://www.blogjava.net/supercrsky/articles/174368.html 文章太长,写的很好,没看完,转过来慢慢理解,品味 简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方...

zmf
2014/09/04
0
0
Spring中的AOP(一)——AspectJ的基本使用

AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充,当前已经成为一种比较成熟的编程思想,其实AOP问世的时间并不长,甚至在国内的翻译还不太统一(另有人...

摆渡者
2014/03/13
0
1
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

ihaolin
2014/03/31
0
0
Spring之使用注解配置Spring AOP

Spring框架通过注解配置AOP是基于AspectJ实现的。 Spring框架只是直接使用了AspectJ的注解,但并没有使用AspectJ的编译器或织入器,仍然是在运行时动态生成AOP代理。 aspectj使用的是静态代理...

Java攻城玩家
05/31
0
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

只想一个人静一静
2014/02/27
0
0
Spring中基于AOP的XML架构

以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-with-spring.html: 为了使用aop命名空间标签,需要导入spring-aop架构,如下......

easonjim
2017/05/25
0
0
《Spring Recipes》第三章笔记1:Enabling AspectJ Annotation

《Spring Recipes》第三章笔记:Enabling AspectJ Annotation 问题 如何开启Spring容器对AspectJ注解的支持。 解决方案 在配置文件中引入aop schema,添加<aop:aspectj-autoproxy />配置。 ...

LiJIaming
2012/05/20
0
0
Spring实战 (四) AOP

在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正...

kenshiro
2013/09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式

1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。 实现 增加一个修饰类包裹原来的...

EasyProgramming
14分钟前
1
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
14分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
42分钟前
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
46分钟前
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
今天
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
1
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部