`

问题:Spring基于@AspectJ参数绑定的原理

阅读更多
  Spring 2.0提供了基于@AspectJ和Schema的AOP配置,有一个问题一直让我很郁闷,那就是增强方法是如何绑定到目标类连接点方法的入参的,Spring通过argNames成员指定入参名来绑定连接点的入参,在Spring的文档中说argNames是为了明确绑定入参名,请看下面的代码:
	@Before("target(com.baobaotao.NaiveWaiter) && args(name,num,..)",argsName="name,num")
	public void bindJoinPointParams(int num,String name){
	   System.out.println("----bindJoinPointParams()----");
	   System.out.println("name:"+name);
	   System.out.println("num:"+num);
	   System.out.println("----bindJoinPointParams()----");
	}

   在切点表达式中,通过args(name,num,..)绑定了两个连接点方法的参数,一个匹配的连接点方法如下:
package com.baobaotao;
public class NaiveWaiter implements Waiter {
   public void smile(String name,int num){
	System.out.println("NaiveWaiter:smile to  "+name+ num+"times...");
   }	
}

   上面的切点,将name和num分别绑定到增强方法的name和num参数中.
   我的问题是,既然args(name,num,..)已经指定了参数名,为什么还需要通过argsName再次声明参数名呢?Spring文档告诉我们:argsName是明确绑定的参数名,说是反射机制无法获取入参名。关键是这种明确的指定有两个问题:

   1)首先,这里指定的信息和切点表达式中args(name,num)中指定的信息是重复的;
   2)其次,我们无法通过反射机制获取目标类连接点smile(String name,int num)参数名,在切面定义中明确指定入参名又有什么意思呢?这好比说,张三和歪毛已经消了名,现在我们确以张三歪毛为线索去查找两人,这有用吗?


   实际上,我们将切点定义处的argNames成员去除,我发现效果是一样的,它照样可以成功绑定。这个问题的本质是既然Java反射机制无法获取入参名,Spring到底是用了何种神秘的机制,获取方法入参名,因为增强方法和目标连接点方法是通过名称关联绑定的,而不是通过类型绑定的。解决了这个问题后,另一个问题才是为什么需要提供argName这个搞怪的成员做重复性的声明工作。
分享到:
评论
1 楼 shaucle 2007-01-29  
InvocationHandler 中有args,也可以打印啊
public Object invoke(Object proxy, Method method, Object[] args)

相关推荐

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

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    spring杂谈 作者zhang KaiTao

    1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor扩展点-2 1.8 Spring3.1 对Bean Validation规范的新支持(方法级别验证) 1.9 Spring对事务...

    Spring中文帮助文档

    使用@RequestParam绑定请求参数到方法参数 13.12.5. 使用@ModelAttribute提供一个从模型到数据的链接 13.12.6. 使用@SessionAttributes指定存储在会话中的属性 13.12.7. 自定义WebDataBinder初始化 13.13. 更多...

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

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring API

    使用@RequestParam绑定请求参数到方法参数 13.12.5. 使用@ModelAttribute提供一个从模型到数据的链接 13.12.6. 使用@SessionAttributes指定存储在会话中的属性 13.12.7. 自定义WebDataBinder初始化 13.13. 更多...

    Spring 2.0 开发参考手册

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    spring chm文档

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

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

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    flance#spring-framework-reference-5.1.3#5.5.基于模式的AOP支持1

    因此,在本节中,我们将重点放在新语法上,并将读者引用到上一节(@AspectJ支持)中的讨论,以了解编写切入点表达式和建议参数的绑定。要使用本节中描述的aop命

    Spring in Action(第2版)中文版

    第8章spring和基于pojo的远程服务 8.1spring远程调用概览 8.2与rmi一起工作 8.2.1连接rmi服务 8.2.2输出rmi服务 8.3使用hessian和burlap的远程调用 8.3.1访问hessian/burlap服务 8.3.2用hessian或burlap公开...

    Spring in Action(第二版 中文高清版).part2

    第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或...

    Spring in Action(第二版 中文高清版).part1

    第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或...

    spring security 参考手册中文版

    Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...

    Spring Security 中文教程.pdf

    14.2. AspectJ (JoinPoint) 安全拦截器 15. 基于表达式的权限控制 15.1. 概述 15.1.1. 常用内建表达式 15.2. Web 安全表达式 15.3. 方法安全表达式 15.3.1. @Pre 和 @Post 注解 15.3.1.1. 访问控制...

    Spring Security-3.0.1中文官方文档(翻译版)

    这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发 者以这一版本的文档为参考。 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    14.2. AspectJ (JoinPoint) 安全拦截器 15. 基于表达式的权限控制 15.1. 概述 15.1.1. 常用内建表达式 15.2. Web 安全表达式 15.3. 方法安全表达式 15.3.1. @Pre 和 @Post 注解 15.3.1.1. 访问控制使用 @...

    高效的缓存管理解决方案AutoLoadCache.zip

    设计思想及原理使用方法注解(Annotation)说明表达式的应用缓存删除注意事项缓存管理页面与Spring Cache的区别源码阅读已经实现基于aspectj,代码在com.jarvis.cache.aop.aspectj.AspectjAopInterceptor。想通过...

    AutoLoadCache:AutoLoadCache是​​基于AOP + Annotation等技术实现的高效的缓存管理解决方案,实现缓存与业务逻辑的解压缩,并增加异步刷新及“拿来主义机制”,以适应高并发环境下的使用

    自动加载缓存 现在使用的缓存技术很多,例如Redis , Memcache , EhCache等,甚至还有使用...已经实现基于aspectj的AOP,代码在。想通过阅读代码了解详细细节,可以以此为入口。 注意:有些类get,set,hash

    应用级产品开发平台APDPlat.zip

    APDPlat提供了应用容器、多模块架构、代码生成、安装程序、认证授权、备份恢复、数据字典、web service、系统监控、操作审计、统计图、报表、机器绑定、防止破解、数据安全、内置搜索、数据转换、maven支持、WEB...

    Maven权威指南 很精典的学习教程,比ANT更好用

    基于Maven插件的全局性重用 1.5. 一个“项目”的概念模型 1.6. Maven是Ant的另一种选择么? 1.7. 比较Maven和Ant 1.8. 总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven ...

Global site tag (gtag.js) - Google Analytics