`

aspectJ 简单例子

阅读更多
1.下载
http://www.eclipse.org/aspectj/downloads.php#stable_release下载AspectJ的最新稳定版本

2. 安装是java -jar aspect-1.6.9.jar
安装后配置好path跟classpath可以直接使用ajc命令
这里没有安装,直接解压了

3.两个测试类
HelloWorld.java
package aaa;
public class HelloWorld {  
    public static void deliver(String message) {  
        System.out.println(message);  
    }  
  
    public static void deliver(String person, String message) {  
        System.out.println(person + ", " + message);  
    }  
  
    public static void round(String s){  
         System.out.println(s);  
    }  
}  

Test.java
package aaa;
public class Test {  
    public static void main(String[] args) {  
        HelloWorld.deliver("Wanna learn AspectJ?");  
        HelloWorld.deliver("Harry", "having fun?");  
        HelloWorld.round("round");  
    }  
}  


4. 编译,运行
java -cp aspectjtools.jar;aspectjrt.jar;classes org.aspectj.tools.ajc.Main -d classes src/aaa/*.java
java -cp classes;aspectjrt.jar aaa.Test

结果
引用

Wanna learn AspectJ?
Harry, having fun?
round

5. 加入切面,编译运行
MannersAspect.java
package aaa;
aspect MannersAspect {  
    // 定义切点 并且指明在哪个方法  
    pointcut deliverMessage() : call(* HelloWorld.deliver(..));  
  
    pointcut afterMessage() : execution (* HelloWorld.deliver(..));  
      
    pointcut roundMessage(String s) : call (* HelloWorld.round(String)) && args(s);  
    // 方法前拦截  
    before() : deliverMessage() {  
        System.out.println("before! ");  
    }  
  
    // 方法后拦截  
    after() : afterMessage(){  
        System.out.println("after! ");  
    }  
  
     void around(String s) : roundMessage(s) {  
        System.out.println("around before! ");  

        proceed("99 "+s+" 00 ");  
        System.out.println("around after! ");  
    }  
      
}  


java -cp aspectjtools.jar;aspectjrt.jar;classes org.aspectj.tools.ajc.Main -d classes src/aaa/*.java
java -cp classes;aspectjrt.jar aaa.Test

结果
引用

before!
Wanna learn AspectJ?
before!
Harry, having fun?
around before!
99 round 00
around after!


6. call 与 execution的区别
call是在调用方法的地方加入切点,会修改Test类
execution是在方法执行的地方加入切点,会修改HelloWorld类

call的切面需要aspect与call调用的类都重新编译,MannersAspect与Test要重新编译
execution需要aspect与方法定义的类重新编译,即MannersAspect与HelloWorld要重新编译
如果对应的类没有重新编译,则切面不会生效
分享到:
评论

相关推荐

    Spring @AspectJ 实现AOP 入门例子

    总的来说,Spring @AspectJ为开发者提供了一种简单、直观的方式来实现面向切面编程。通过定义切面和通知,我们可以将关注点分离,提高代码的可维护性和复用性。在实际项目中,这种技术常用于日志、事务管理、性能...

    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实例(XML+@AspectJ双版本解析+源码+类库)

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

    征服Spring AOP—— @AspectJ

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

    aspectj开发包

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

    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(* ...

    aspectJ与XML配置的AOP

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

    基于XML的声明式AspectJ

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

    Andorid AspectJ 的demo

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

    SpringAOP+AspectJ

    在这个例子中,我们将重点讨论Spring AOP以及如何结合AspectJ进行更深入的切面编程。 **一、Spring AOP基础** Spring AOP是Spring框架的一部分,它提供了一种在运行时动态地将行为加入到对象中的方法。AOP的核心...

    AspectJ in Action: Enterprise AOP with Spring Applications

    - **提高测试性:**将横切关注点从核心业务逻辑中分离出来后,可以使单元测试更加简单易行。 #### 面向切面编程(AOP)原理与实践 - **AOP基本概念:** - **切面(Aspect):**一个关注点的模块化表示。 - **连接点...

    AspectJ for Spring Developers

    在这个例子中,`loggedOperations`是一个pointcut,它匹配所有在`banking`包及其子包内的方法调用。`before()`和`after()`是advice,分别在方法执行前和执行后执行,用于记录日志信息。 Spring AOP是Spring框架自带...

    Spring AOP 概念理解及@AspectJ支持

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

    简单spring aop 例子

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

    AspectJ的基本用法

    以下是一个简单的AspectJ @Before Advice的例子: ```java @Before("execution(* android.app.Activity.on**(..))") public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable { // 在Activity...

Global site tag (gtag.js) - Google Analytics