声明通知Advice

  • 配置方式(以前置通知为例子)

    • 方式一

      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
      <aop:before method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
      package com.jing.spring.aop;
      /**
      * 业务代码
      */
      public class IKAspectBiz { public void add(String name){
      System.out.println("IKAspectBiz.add");
      }
      }
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint; /**
      * 切面代码
      */
      public class IKAspect { public void aspectBefore(String name){
      System.out.println("IKAspect.aspectBefore,it~s 前置通知");
      System.out.println("IKAspect.aspectBefore,it~s 前置通知"+name);
      }
      }
      • 优点:前置通知、后置通知、环绕通知使用同一个切点时,配置一个<aop:poincut />即可,方便配置。
    • 方式二
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
      </aop:aspect>
      </aop:config>
      package com.jing.spring.aop;
      /**
      * 业务代码
      */
      public class IKAspectBiz { public void add(String name){
      System.out.println("IKAspectBiz.add");
      }
      }
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint; /**
      * 切面代码
      */
      public class IKAspect { public void aspectBefore(String name){
      System.out.println("IKAspect.aspectBefore,it~s 前置通知");
      System.out.println("IKAspect.aspectBefore,it~s 前置通知"+name);
      }
      }
      • 优点:前置通知、后置通知、环绕通知使用不同切点时,不需要配置<aop:poincut />元素,可以直接在<aop:before />元素内配置切点。
    • Next
  • 前置通知(Before Advice)
    • 在切入点时机事务执行之前,执行通知
    • 方式一
       <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
      <aop:before method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
    • 方式二
       <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
      </aop:aspect>
      </aop:config>
    • Next
  • 后置通知(After Running Advice)
    • 在切入点时机事务执行之后,执行通知(前提:切入点执行时没有异常,否则不会执行)
    • 方式一
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
      <aop:after-returning method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
    • 方式二
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:after-returning method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
      </aop:aspect>
      </aop:config>
    • Next
  • 抛出异常通知(After Throwing Advice)
    • 若在切入点时机执行时抛出异常,执行通知。(执行异常通知,则不会执行后置通知)
    • 方式一
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name) "></aop:pointcut>
      <aop:after-throwing method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
    • 方式二
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:after-throwing method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
      </aop:aspect>
      </aop:config>
    • Next
  • 后通知(After Ending Advice)
    • 在切入点时机执行之后,执行通知。(切入点执行时,无论正常执行,还是抛出异常,都会执行通知,相当于try_catch_finally)。
    • 方式一
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
      <aop:after method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
    • 方式二
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:after method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
      </aop:aspect>
      </aop:config>
    • Next
    • 无论切面是否出现异常,后通知动作正常执行
  • 环绕通知(Around Advice)
    • 环绕通知在
    • 方式一
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd" > <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
      <bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean> <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:pointcut>
         <aop:around method="aspectAroundParams" pointcut-ref="ikPoint"></aop:around>
      </aop:aspect>
      </aop:config> </beans>
      package com.jing.spring.aop;
      
      /**
      * 业务代码
      */
      public class IKAspectBiz { public void aopParams(String name,int times){
      System.out.println("IKAspectBiz.aopParams");
      }
      }
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint; /**
      * 切面代码
      */
      public class IKAspect {
      public void aspectAroundParams(ProceedingJoinPoint pj,String name,int times){ System.out.println("IKAspect.aspectAroud,its 环绕通知前:");
      System.out.println("IKAspect.aspectAroud,"+name+"-----"+times);
      try {
      Object proceed = pj.proceed();
      } catch (Throwable throwable) {
      throwable.printStackTrace();
      }
      System.out.println("IKAspect.aspectAroud,its 环绕通知后");
      System.out.println("IKAspect.aspectAroud,"+name+"-----"+times); }
      }
    • 方式二
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd" > <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
      <bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean> <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
         <aop:around method="aspectAroundParams" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:around>
      </aop:aspect>
      </aop:config> </beans>
      package com.jing.spring.aop;
      
      /**
      * 业务代码
      */
      public class IKAspectBiz { public void aopParams(String name,int times){
      System.out.println("IKAspectBiz.aopParams");
      }
      }
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint; /**
      * 切面代码
      */
      public class IKAspect { public void aspectAroundParams(ProceedingJoinPoint pj,String name,int times){ System.out.println("IKAspect.aspectAroud,its 环绕通知前:");
      System.out.println("IKAspect.aspectAroud,"+name+"-----"+times);
      try {
      Object proceed = pj.proceed();
      } catch (Throwable throwable) {
      throwable.printStackTrace();
      }
      System.out.println("IKAspect.aspectAroud,its 环绕通知后");
      System.out.println("IKAspect.aspectAroud,"+name+"-----"+times); }
      }
    • Next

谨记

  • 切面中的参数来源是从业务中取得的,也就是说,只有在切点中的参数,才会传送到相对应的切面中,所以,切面中方法参数和切点时机的参数要保持对应。
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:pointcut>
<aop:around method="aspectAroundParams" pointcut-ref="ikPoint"></aop:around>
  • (以环绕通知举例)上述中的args(name,times)中的参数name对应切面IKAspect 类中的aspectAroundParams(ProceedingJoinPoint pj,String name,int times)方法中的参数,并且参数名称和顺序需要与切面中的通知方法参数名称和顺序一致。
  • (以环绕通知举例)上述中的aopParams(String,int)中的参数是对应业务IKAspectBiz 类中的aopParams(String name,int times)方法中的参数类型。

Spring 学习——Spring AOP——AOP配置篇Advice(有参数传递)的更多相关文章

  1. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  2. Spring 学习——Spring AOP——AOP概念篇

    AOP AOP的定义:AOP,Aspect Oriented Programming的缩写,意为面向切面编程,是通过预编译或运行期动态代理实现程序功能处理的统一维护的一种技术 实现方式 预编译 Asp ...

  3. spring学习06(AOP)

    9.AOP 什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  4. Spring学习笔记4——AOP

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  5. Spring学习--基于 XML 的配置声明切面

    正常情况下 , 基于注解的生命要优先于基于 XML 的声明. 通过 AspectJ 注解 , 切面可以与 AspectJ 兼容 , 而基于 XML 的配置则是 Spring 专有的.由于 Aspect ...

  6. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Spring学习七----------Bean的配置之自动装配

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...

  9. Spring Boot 探索系列 - 自动化配置篇

    26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging f ...

  10. Spring学习八----------Bean的配置之Resources

    © 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...

随机推荐

  1. mysql 储存过程

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  2. 线性表->顺序存储

    文字描述: 用一组地址连续的存储单元依次存储线性表的数据元素,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构. 即是,线性表的顺序存 ...

  3. Mybatis异常--There is no getter for property named 'XXX' in 'class java.lang.String'

    第一种 在service层加@Param(value="ip") void deleteIpsetup(@Param(value="ip")String ip) ...

  4. JMeter-性能测试监控(解决.sh文件的启动)

    下载插件 https://jmeter-plugins.org/downloads/old/ 已安装了jmeter-plugins-manager,装的这个不知道生没生效.... 2.问题:启动就显示 ...

  5. 820板子安装python

    1. 需要安装python, 从 python.org上下载版本,我下的是python3.5,网上搜索到的是python2.7的交叉编译过程 和820的结合下. 需要注意,先把820的环境设置好,就是 ...

  6. Java课堂测试——一维数组

    题目: 一个典型的流程是: 2. 用户这时候有两个选择2.1  按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等. 最好用不同的 ...

  7. 用php实现斐波那契数列,如: 1, 1, 2, 3, 5, 8, 13, 21, 34。用数组求出第20个数的值。

    <?php //用数组 function fib($n){ $array = array(); $array[0] = 1; $array[1] = 1; for($i=2;$i<$n;$ ...

  8. TP5新增模块

    tp5模块自动生成 1build.php配置要生成的目录 <?php// +----------------------------------------------------------- ...

  9. 蓝桥杯近3年决赛题之二(16年b组)

    做的时候只做对了第一题. 1. 一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制 ...

  10. 001-ADO.NET

    Web.config <connectionStrings> <add name="connStr" connectionString="server= ...