`
步行者
  • 浏览: 170179 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

AspectJ的一个简单例子

    博客分类:
  • AOP
阅读更多

AspectJ 是一个特定于java语言的面向方面编程语言。官方网站是 http://www.eclipse.org/aspectj/

AspectJ已经很成熟,并且有一个成熟的编辑工具:AJDT (eclipse插件)

 

下面介绍一个AspectJ的简单例子,从而对AspectJ有一个直观的认识:

 

在面向对象语言中,我们一般用一个类处理一个关注点的需求。

但是在很多情况下,类不仅要处理自己的关注点,还必须满足另一个关注点的需求。

也就是说类被系统中的多个关注点横切了.

在类中多种关注点的混合将会导致代码分散 代码纠缠 的发生。

代码分散 是指处理一个关注点所需的代码会分散到处理其他关注点的类中。

代码纠缠 是指利用一个类或方法实现了系统中的多个关注点。

 

下面是一个People类:

 

 

public class People {
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

这个类实现了系统中People数据对象的类模型。我们把它称为主要关注点。

但是现在出现了一个新的需求,就是对所有People对象的属性访问都要记录日志。

即一个次要关注点(横切关注点):对所有People对象的属性访问都要记录日志。

下面是将次要关注点直接编码到People类的代码:

 

 

public class People {
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		System.out.println(">>> Log : modify people's attribute ...");


		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		System.out.println(">>> Log : modify people's attribute ...");


		this.age = age;
	}
}
 

虽然People类实现了日志功能,不过日志关注点的代码分散到了实现People类模型的代码中(代码分散),而且People

类实现了多个关注点(代码纠缠)。这样对代码的修改于维护都是很不利的。

现在我们利用AspectJ来将这两个关注点分离。下面是AspectJ代码:

 

 

public aspect PeopleAspect {
	pointcut setXXX():
		call(public void People.set*(*));
	
	before():setXXX(){
		System.out.println(">>> Log : modify people's attribute ...");
	}
}

 

利用AspectJ编译器编译AspectJ程序和第一个People类(即将AspectJ程序织入到第一个People类中),

然后运行下面的主程序测试:

 

 

public static void main(String[] args){
		People p = new People();
		p.setAge(24);
		p.setName("Tom");
	}
 

控制台输出如下:

 

 

   >>> Log : modify people's attribute ...

   >>> Log : modify people's attribute ...

 

我们发现同样实现了日志功能,而且程序结构更加清晰。

AspectJ的语法类似于Java的语法,不过有一些特殊的关键字,关于它的更多内容请参见AspectJ官方文档。

 

 

分享到:
评论

相关推荐

    Spring @AspectJ 实现AOP 入门例子

    本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...

    Aop之AspectJ详解解读demo

    在"AopDemo-master"压缩包中,通常包含了一个简单的AspectJ示例项目,可能包括以下部分: 1. **源代码**:包含切面类(如LoggingAspect)和业务逻辑类(如Service类)。 2. **配置文件**:如Spring的XML配置文件,...

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    aspectj用的的jar包

    以下是一个简单的AspectJ事务管理切面示例: ```java @Aspect @Component public class TransactionAspect { @Around("execution(* com.example.repository.*.*(..))") public Object handleTransaction...

    征服Spring AOP—— @AspectJ

    例如,我们创建一个简单的日志记录切面: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void allServiceMethods() {} @Before(...

    Spring的AOP实例(XML+@AspectJ双版本解析+源码+类库)

    我们将通过一个简单的例子,演示如何在XML和@AspectJ两种模式下实现日志记录的切面。这将包括定义切入点、通知的编写,以及如何在应用程序上下文中注册这些切面。 7. 性能与选择 尽管@AspectJ提供了更丰富的表达...

    aspectj开发包

    例如,下面是一个简单的AspectJ注解示例: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out....

    aspectJ与XML配置的AOP

    以下是一个简单的例子: ```xml (* com.example.service.*.*(..))"/> (* com.example.service.*.*(..))"/> ``` 在这个例子中,`loggingAspect`是一个切面,引用了`loggingService` bean,其中`logBefore...

    Spring AOP + AspectJ annotation example

    下面是一个简单的例子,展示如何使用AspectJ注解: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { // ...

    Spring2.5使用AOP需要的aspectJ

    例如,一个简单的切面可能如下所示: ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* ...

    Andorid AspectJ 的demo

    总的来说,"Android AspectJ的demo"提供了一个学习和实践AOP在Android开发中应用的实例,它涵盖了切面的定义、切点选择和通知执行等关键概念。通过深入研究这个demo,开发者可以掌握如何利用AspectJ来改进Android...

    基于XML的声明式AspectJ

    在这个例子中,`LoggingService`是一个包含`beforeServiceExecution`和`afterServiceExecution`方法的切面类。`serviceMethods`切入点匹配了`com.example.service`包下的所有方法。`beforeServiceExecution`方法将在...

    SpringAOP+AspectJ

    以下是一个简单的例子: ```java @Aspect @Component public class OrderAspect { @Before("execution(* com.example.order.service.OrderService.createOrder(..))") public void logBeforeCreateOrder...

    AspectJ for Spring Developers

    以BankLoggingAspect为例,这是一个简单的日志记录方面: ```java public aspect BankLoggingAspect { private static Logger _logger = Logger.getLogger("banking"); public pointcut loggedOperations() : ...

    Spring AOP 概念理解及@AspectJ支持

    例如,下面的代码展示了如何使用@AspectJ定义一个简单的切面: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint...

    AspectJ in Action: Enterprise AOP with Spring Applications

    - **Spring AOP简介:**Spring AOP是基于Spring框架的一个子项目,它提供了一种声明式的方式来进行面向切面编程。Spring AOP使用注解和XML配置来定义切面、连接点和通知。 - **AspectJ介绍:**AspectJ是一种全面的...

    简单spring aop 例子

    现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切面是包含通知(Advice)和切入点(Pointcut)的类。通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`...

    一个hellword例子

    标题中的"一个HelloWorld例子"指的是使用AspectJ编写的简单示例程序,通常用于初学者了解和学习AspectJ的基本用法。这个例子将帮助我们理解如何定义切面、通知(advice)以及它们如何影响应用程序的行为。 描述中...

Global site tag (gtag.js) - Google Analytics