`

spring Aop 关于arg-name的一些理解

    博客分类:
  • j2ee
 
阅读更多

spring aop中有些参数比较难以理解 比如说arg-names,下面先从简单说起:

Aop类

Java代码  收藏代码
  1. /** 
  2.  * 需要织入的类,及其方法。 
  3.  * @author ChdYan 
  4.  * @since jdk1.6 
  5.  */  
  6. public class TestAop {  
  7.   
  8.     /** 
  9.      * 在目标方法前织入的方法 
  10.      * @param i 测试参数 
  11.      * @param name 测试参数 
  12.      * @param p 测试参数 
  13.      */  
  14.     public void before(String name, int age, String address)  {  
  15.         System.out.println(name + "," + age + "," + address);  
  16.         System.out.println("--------------开始啦before------------");  
  17.     }  
  18.       
  19.     /** 
  20.      * 在目标方法返回前织入的方法 
  21.      * @param i 
  22.      * @param name 
  23.      * @param p 
  24.      */  
  25.     public void after(String name, int age, String address)  {  
  26.         System.out.println(name + "," + age + "," + address);  
  27.         System.out.println("--------------开始啦after------------");  
  28.     }  
  29.       
  30.     /** 
  31.      * 在目标方法前后织入的方法 
  32.      * @param pjp 
  33.      * @param name 
  34.      * @param age 
  35.      * @throws Throwable 
  36.      */  
  37.     public void around(ProceedingJoinPoint pjp) throws Throwable {  
  38.         System.out.println(Arrays.toString(pjp.getArgs()));  
  39.         System.out.println("--------------开始啦around------------");  
  40.         pjp.proceed(pjp.getArgs());  
  41.         System.out.println("--------------结束啦around------------");  
  42.     }  
  43.       
  44.       
  45.     /** 
  46.      * 在目标方法返回后后织入的方法 
  47.      * @param name 
  48.      */  
  49.     public void afterReturning(String name){  
  50.         System.out.println("======after Return==== " + name);  
  51.     }  
  52.       
  53.     /** 
  54.      * 在目标方法返回后后织入的方法 
  55.      * @param name 
  56.      */  
  57.     public void afterThrowing(Exception e){  
  58.         System.out.println("======after Return====e " + e);  
  59.     }  
  60.   
  61. }  

 befor、after里都有三个参数。下面看需要织入的类

Java代码  收藏代码
  1. /** 
  2.  * 简单测试类,测试织入增强。 
  3.  * @author ChdYan 
  4.  <a href="mailto:*@since">* @since</a> jdk1.6 
  5.  */  
  6. public class User {  
  7.       
  8.     private String username;  
  9.   
  10.     /** 
  11.      * 需要织入的方法 
  12.      * @param name 名字 
  13.      * @param age 姓名 
  14.      * @param address 地址 
  15.      * @return 用户名称 
  16.      */  
  17.     public String getUsername(String name, int age, String address) {  
  18.         System.out.println("------------调用方法开始:-------");  
  19.         System.out.println(name + "----" + age + "----" + address);  
  20.         System.out.println("------------调用方法结束:-------");  
  21.         return username;  
  22.     }  
  23.       
  24.     /** 
  25.      * 需要织入的方法 
  26.      * @param name 名称 
  27.      * @return 用户名称 
  28.      */  
  29.     public String getUsername(String name) {  
  30.         System.out.println("------------调用方法开始:-------");  
  31.         System.out.println(name + "----");  
  32.         System.out.println("------------调用方法结束:-------");  
  33.         if(1 == 1) {  
  34.             throw new RuntimeException();  
  35.         }  
  36.         return username;  
  37.     }  
  38.   
  39.     public void setUsername(String username) {  
  40.         this.username = username;  
  41.     }  
  42.       
  43.   
  44. }  

 

织入类比较简单,明白意思就行。

Xml代码  收藏代码
  1. <bean class="cn.g.model.User" id="user">  
  2.     <property name="username" value="zhangshan"></property>  
  3. </bean>  
  4. <bean id="aopTest" class="cn.g.aop.TestAop"></bean>  
  5. <aop:config proxy-target-class="true">  
  6.     <aop:pointcut expression="execution(* cn.g.model.*.get*(..)) and args(arg1, arg2, arg3)" id="acut"/>  
  7.     <aop:aspect ref="aopTest">  
  8.         <aop:before method="before" pointcut-ref="acut" arg-names="arg1, arg2, arg3"/>  
  9.         <aop:after method="after" pointcut-ref="acut" arg-names="arg1, arg2, arg3"/>  
  10.         <aop:around method="around" pointcut="execution(* cn.g.model.*.get*(..))"/>  
  11.         <aop:after-returning method="afterReturning" pointcut="execution(* cn.g.model.*.get*(..))" returning="arg" arg-names="arg"/>  
  12.         <aop:after-throwing method="afterThrowing" pointcut="execution(* cn.g.model.*.get*(..))"  throwing="arg" arg-names="arg"/>  
  13.     </aop:aspect>  
  14. </aop:config>  

 

expression="execution(* cn.g.model.*.get*(..)) and args(arg1, arg2, arg3)"  args在这里是作为织入方法的入参,所以其个数与类型需要与织入方法一致,并且与在<aop:before与<aop:after中的增强也要一致的,才能织入。主要原因是:1.方法前织入增强也只是知道方法入参,其他参数一概获取不到,那么只能用方法参数作为args的入参了。2.同样,方法后织入增强也是只知道方法的参数,其他一概不知。。

 

<aop:around 通知的入参 ProceedingJoinPoint pjp由spring自动注入,ProceedingJoinPoint pjp所含了所有的入参与目标方法等,所以不必增加像<aop:before中的arg-names和expression中也不必包含

 

 <aop:after-returning 中增强的入参只有一个,就是织入方法的返回值,类型、个数要一致,所以很好理解。

 

<aop:after-throwing  同  <aop:after-returning  一样,增强中也只有一个入参且就是抛出的异常,所以类型、个数要一致,这也比较好理解

 

 

Java代码  收藏代码
  1. /** 
  2.  * 测试类 
  3.  * @author ChdYan 
  4.  * @since jdk1.6 
  5.  */  
  6. public class TestAop {  
  7.     public static void main(String[] args) {  
  8.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  9.         User user = ctx.getBean(User.class);  
  10.         System.out.println(user.getUsername("romico"25"china"));  
  11.         System.out.println(user.getUsername("romico"));  
  12.     }  
  13. }  

 

 最后结果如图

 

 

 

分享到:
评论

相关推荐

    用xml配置的方式进行SpringAOP开发

    不过,理解XML配置方式有助于深入理解Spring AOP的底层原理。 总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们...

    spring-context-4.2.xsd.zip

    总结而言,`spring-context-4.2.xsd`是Spring 4.2版本Context模块的核心配置规范,它定义了Spring XML配置文件的结构,涵盖了bean定义、依赖注入、作用域、AOP、事件处理等多个方面的内容。理解并熟练运用`spring-...

    Spring AOP中使用args表达式的方法示例

    Spring AOP中使用args表达式的方法示例 Spring AOP(Aspect-Oriented Programming)是一种面向切面编程的技术, args表达式是AOP中的一种表达式,它可以用来指定目标方法的参数类型和数量。下面我们将详细介绍...

    spring AOP日志框架

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改源代码的情况下,通过在程序运行时动态地插入代码来实现横切关注点,如日志记录、事务管理、性能监控等。在Spring AOP中,日志框架...

    Spring配置文件spring-context.zip

    总之,`spring-context.zip`中的`applicationContext.xml`是Spring应用的核心配置,它定义了bean的结构、依赖关系以及各种行为,是理解与掌握Spring框架的关键。通过熟练运用这些配置,开发者可以构建出灵活、可扩展...

    spring-developing-java-applications-enterprise

    2. **理解Spring的打包结构**:Spring的库文件通常被打包成不同的模块,每个模块负责不同的功能。 3. **使用Spring Source Tool Suite (STS)**:这是一个专为Spring开发设计的IDE,能够极大地提高开发效率。 4. **...

    Spring.net整合WCF-精简版

    Spring.NET是Spring框架的一个.NET版本,它提供了核心容器、数据访问/集成、AOP(面向切面编程)、Web支持以及测试工具等模块。核心容器负责对象的创建和管理,而依赖注入是其核心功能,允许开发者解耦组件,降低...

    Spring中AOP实现EHCache的整合中采用SpringModule结合(二)

    首先,我们需要理解Spring Modules(SpringModule)项目,这是一个为Spring框架提供额外功能的开源项目,它包含了对包括EHCache在内的多种缓存系统的支持。SpringModule使得在Spring中集成缓存变得更加方便,通过...

    Spring-3.0.xsd

    Spring-3.0.xsd还引入了一些新的特性,例如: - **Namespace Handler**:允许自定义命名空间,扩展XML配置,如数据源、任务调度等。 - **Profile**:支持环境相关的配置,可以根据不同的运行环境加载不同的配置。 -...

    Spring集成Thrift--Server AND Client

    在IT行业中,Spring框架...结合Spring的IoC和AOP特性,我们可以方便地管理服务实例和事务处理,提高代码的可维护性和复用性。在实际开发中,还需要注意网络环境、异常处理、性能优化等方面的问题,确保系统的稳定运行。

    spring-ldap-1.3.1.RELEASE-with-dependencies.zip

    《Spring LDAP 1.3.1.RELEASE:深入理解与应用》 Spring LDAP是Spring框架的一个扩展,专门用于处理 Lightweight Directory Access Protocol (LDAP) 的应用程序开发。它将Spring的编程模型引入了目录服务,提供了...

    SSM模式学习路线-----[Spring入门笔记](csdn)————程序.pdf

    【Spring入门笔记】主要介绍了Spring框架的基础知识,包括Spring的核心概念、Bean的配置与作用域、依赖注入、SpringAop和SpringJdbc,以及事务声明。以下是对这些知识点的详细说明: 1. **什么是Spring?** Spring...

    tiny-spring-step-4-config-beanfactory-with-xml.zip

    &lt;property name="name" value="Spring Example"/&gt; ``` 在这个例子中,`&lt;beans&gt;`元素是根元素,表示一个配置文件。`&lt;bean&gt;`元素则用来定义一个Bean,`id`属性用于唯一标识Bean,`class`属性指定了Bean的全限定...

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    在本文中,我们将深入探讨如何在Spring Security 2.0版本中配置并使用AOP(面向切面编程)来实现方法级别的权限控制。首先,我们需要理解Spring Security的基础概念。 1. **Spring Security基本架构** Spring ...

    spring_aop_ioc完全讲解

    在Spring框架中,AOP(面向切面编程)和IOC(控制反转)是两个核心概念,它们极大地简化了Java应用的开发和维护。下面将详细解释这两个概念以及如何在实际应用中使用它们。 **控制反转(Inversion of Control, IOC...

    spring applicationContext 配置文件

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd ...

    Spring.html

    --全局初始化参数--&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:applicationContext.xml&lt;/param-value&gt; &lt;/context-param&gt; 4.在Servlet中使用...

    spring01-1

    标题 "spring01-1" 暗示我们即将探讨的是关于 Spring 框架的基础内容,特别是不涉及注解的使用方式。Spring 是一个广泛使用的 Java 应用开发框架,它提供了依赖注入(Dependency Injection,DI)和面向切面编程...

    spring boot如何使用spring AOP实现拦截器

    1. **AOP(面向切面编程)**:AOP是Spring框架的一个重要特性,它允许程序员定义“切面”,这些切面可以包含业务逻辑的“侧面”——例如日志、事务管理、安全检查等。AOP使得我们可以将这些关注点与主要的业务逻辑...

    三大框架之一Spring

    - **Spring AOP**:提供了面向切面的编程实现,从而可以将一些通用的服务如日志记录、事务管理、安全检查等从业务逻辑中解耦出来。 - **Spring DAO**:提供了JDBC的抽象层,这使得数据库访问变得更为容易,同时大大...

Global site tag (gtag.js) - Google Analytics