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,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...
在"AopDemo-master"压缩包中,通常包含了一个简单的AspectJ示例项目,可能包括以下部分: 1. **源代码**:包含切面类(如LoggingAspect)和业务逻辑类(如Service类)。 2. **配置文件**:如Spring的XML配置文件,...
一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......
以下是一个简单的AspectJ事务管理切面示例: ```java @Aspect @Component public class TransactionAspect { @Around("execution(* com.example.repository.*.*(..))") public Object handleTransaction...
例如,我们创建一个简单的日志记录切面: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void allServiceMethods() {} @Before(...
我们将通过一个简单的例子,演示如何在XML和@AspectJ两种模式下实现日志记录的切面。这将包括定义切入点、通知的编写,以及如何在应用程序上下文中注册这些切面。 7. 性能与选择 尽管@AspectJ提供了更丰富的表达...
例如,下面是一个简单的AspectJ注解示例: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out....
以下是一个简单的例子: ```xml (* com.example.service.*.*(..))"/> (* com.example.service.*.*(..))"/> ``` 在这个例子中,`loggingAspect`是一个切面,引用了`loggingService` bean,其中`logBefore...
下面是一个简单的例子,展示如何使用AspectJ注解: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { // ...
例如,一个简单的切面可能如下所示: ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* ...
总的来说,"Android AspectJ的demo"提供了一个学习和实践AOP在Android开发中应用的实例,它涵盖了切面的定义、切点选择和通知执行等关键概念。通过深入研究这个demo,开发者可以掌握如何利用AspectJ来改进Android...
在这个例子中,`LoggingService`是一个包含`beforeServiceExecution`和`afterServiceExecution`方法的切面类。`serviceMethods`切入点匹配了`com.example.service`包下的所有方法。`beforeServiceExecution`方法将在...
以下是一个简单的例子: ```java @Aspect @Component public class OrderAspect { @Before("execution(* com.example.order.service.OrderService.createOrder(..))") public void logBeforeCreateOrder...
以BankLoggingAspect为例,这是一个简单的日志记录方面: ```java public aspect BankLoggingAspect { private static Logger _logger = Logger.getLogger("banking"); public pointcut loggedOperations() : ...
例如,下面的代码展示了如何使用@AspectJ定义一个简单的切面: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint...
- **Spring AOP简介:**Spring AOP是基于Spring框架的一个子项目,它提供了一种声明式的方式来进行面向切面编程。Spring AOP使用注解和XML配置来定义切面、连接点和通知。 - **AspectJ介绍:**AspectJ是一种全面的...
现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切面是包含通知(Advice)和切入点(Pointcut)的类。通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`...
标题中的"一个HelloWorld例子"指的是使用AspectJ编写的简单示例程序,通常用于初学者了解和学习AspectJ的基本用法。这个例子将帮助我们理解如何定义切面、通知(advice)以及它们如何影响应用程序的行为。 描述中...