`

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要重新编译
如果对应的类没有重新编译,则切面不会生效
分享到:
评论

相关推荐

    AspectJ经典实例详解

    AspectJ经典实例 用例简单明了,适合初学者!~希望大家能多多交流!~

    spring AOP 实例(@AspectJ)

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

    基于框架的Web开发-基于AspectJ的AOP.doc

    2 一个简单的基于@AspectJ的AOP例子 2.1 创建Performance接口 创建Performance(表演、演出)接口,接口包含一个方法perform(),包名为aop(本章的类均放在aop包中)。 2.2 创建Performance接口的实现类Ballet 创建...

    安卓聊天基于socket底层简单例子,不妥之处很多,学习之用

    客户端与服务端均在里面,服务端未连数据库,数据存配置。

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...

    spring-aop实例demo

    spring3.2.8使用aop的简单实例

    spring 3.0 jar 所有开发包及开发项目实例

    spring 3.0 jar 最新所有开发包及开发项目实例 spring 3.0已经全面支持OSGi了。 各发行包的大致描述如下: org.springframework.asm-3.0.0.M4.jar: 提供对ASM(一个字节码框架)的简单封装 org.springframework....

    Spring4—AOP编程

    aop写一个简单的计算器:(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);...利用简单的实例来理解spring的aop编程,以aspectJ为例,理解环绕通知的真正含义。

    spring aop demo

    这是用spring和aspectj 和cglib实现了切面编程的一个很简单的实例代码demo,供自己和大家参考

    09_高性能应用设计与开发技术.pptx

    不要每次请求都实例化Spring Context; 对可以在后台运行的任务,考虑使用Spring的异步任务执行器来减少用户等待时间; 选择合适的远程访问协议,比如不需要SOAP的互通性,一个简单方案(如Spring的HttpInvoker支持...

    Spring 2.0 开发参考手册

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性...

    Spring中文帮助文档

    2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...

    Spring API

    2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...

    Spring AOP 动态代理(二)

    代理模式其实很简单 主要包括 接口+真实的实现类+代理类 在真实类的实例化的时候 使用代理类,所以需要 Spring AOP 做的是生成一个代理类,然后替换真实的类 去对外提供服务 那怎么去替换呢? 就是Spring IOC 容器中...

    spring chm文档

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring.3.x企业应用开发实战(完整版).part2

    7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 ...

    Spring3.x企业应用开发实战(完整版) part1

    7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 ...

    Spring+3.x企业应用开发实战光盘源码(全)

     第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。  第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架...

Global site tag (gtag.js) - Google Analytics