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. **依赖注入增强**:Spring 3.1.0增强了依赖注入(DI)的灵活性,通过使用@Profile注解,可以基于不同的运行环境配置不同的bean。这样,在开发和生产环境中可以使用不同的配置,而无需大量的条件判断。 2. **Java...
本主题将深入探讨Spring中的事务管理,特别是基于AspectJ的两种方式:XML配置和注解方式。AspectJ是一种强大的面向切面编程(AOP)工具,它可以与Spring框架集成,用于声明式事务管理。 ### XML方式的AspectJ事务...
《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架的专业书籍,旨在帮助读者理解Spring的核心架构和设计思想。Spring作为Java企业级应用开发中的主流框架,其强大的功能和灵活的设计使得它...
Spring MVC在3.0版本中进行了重大升级,增加了更多特性,如:RESTful支持、视图解析器增强、模型属性绑定、类型安全的参数绑定等。这使得Spring MVC成为一个功能强大的Web MVC框架,能更好地应对现代Web应用的需求...
- **对象绑定与类型转换**:探讨Spring MVC中对象绑定的过程及类型转换机制。 - **控制器执行流程**:详细解析Spring MVC控制器的执行流程。 - **返回值处理器**:分析Spring MVC中的视图解析机制。 - **...
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来...
6. **MVC框架**:Spring MVC是Spring提供的Web应用开发框架,它支持Model-View-Controller模式,提供视图解析、模型绑定、数据验证等功能,与Spring其他模块无缝集成。 7. **JMS支持**:Spring 2.5提供了对Java消息...
- **@AspectJ支持**:Spring对AspectJ的集成。 - **基于Schema的AOP支持**:使用XML配置AOP。 - **选择AOP声明样式**:根据需求选择合适的AOP实现方式。 - **混合Aspect类型**:在同一应用中结合使用不同类型的...
1. AOP实现:Spring提供了基于代理的AOP(包括JDK动态代理和CGLIB代理)和基于 AspectJ 的AOP实现。前者适用于接口,后者适用于无接口的类。 2. 数据访问:Spring支持多种数据访问技术,如JDBC、Hibernate、MyBatis...
10. ** 更强大的数据绑定**:Spring 3提供了更强大和灵活的数据绑定机制,允许开发者在表单和模型之间进行复杂的映射操作。 描述中的“博文链接:https://zhou-he.iteye.com/blog/1187327”可能提供了一个具体的...
11. **AspectJ集成**:Spring 3.0强化了对AspectJ的支持,可以使用更强大的AspectJ语法来定义切面。 12. **WebSocket支持**:Spring 3.0开始支持WebSocket,提供了WebSocket消息传递的基础设施,便于实现实时通信。...
### Spring技术内幕与深入解析Spring架构与设计 #### 书籍概述 本书《Spring技术内幕+深入解析Spring架构与设计》是一本专为Spring框架开发者所撰写的深度技术指南。作者凭借超过十年的Java开发经验,从Spring 3.0...
**Spring Boot**是一个基于Spring框架的快速开发框架,具有以下特点: - **自动配置**:默认配置大多数Spring应用程序需要的设置。 - **起步依赖**:提供预配置的依赖项集合,简化依赖管理。 - **内嵌Web服务器**:...
**基于XML的声明式AspectJ** AspectJ是一种强大的面向切面编程(AOP)框架,它允许开发者在Java应用程序中分离关注点,如日志、事务管理、性能监控等,从而实现更清晰、更模块化的代码结构。XML的声明式AspectJ是...
Spring MVC支持自动的数据绑定,可以从请求参数自动填充表单域对象。配合JSR-303/JSR-349的bean验证,可以对表单数据进行验证。 10. **上传文件**: Spring MVC提供了MultipartFile接口,用于处理文件上传。...
- **@AspectJ 支持**:支持基于 @AspectJ 的切面编程。 - **Schema 基础的 AOP 支持**:提供了 XML 配置方式的 AOP 支持。 - **混合切面类型**:可以同时使用基于注解和基于 XML 的 AOP。 以上内容概括了 Spring...
Spring 3.0是Spring框架的一个重要版本,它引入了许多新特性和改进,极大地提升了开发效率和灵活性。这个"spring3.0的最新官方例子源码spring-samples"压缩包包含的是Spring官方提供的示例代码,旨在帮助开发者理解...
- **AspectJ集成**:Spring 2.0开始支持全注解的AOP,通过AspectJ的编译时或运行时织入,使切面编程更加直观。 - **JSR-250注解**:引入了JSR-250规范中的注解,如`@PostConstruct`和`@PreDestroy`,简化了组件生命...
8. **SpringBoot与Spring的关系**:SpringBoot是基于Spring框架的快速开发工具,它简化了Spring应用的初始设置,通过自动配置和起步依赖使得开发变得更加简单。 9. **SpringMVC**:作为Spring框架的一部分,...