zoukankan      html  css  js  c++  java
  • Spring 基于xml配置方式的AOP

    我们具体用代码来说明:

    1、ArithmeticCalculator.java

    1 package com.proc;
    2 
    3 public interface ArithmeticCalculator {
    4     int add(int i, int j);
    5     int sub(int i, int j);
    6     
    7     int mul(int i, int j);
    8     int div(int i, int j);
    9 }

    2、ArithmeticCalculatorImpl.java 实现接口ArithmeticCalculator

     1 package com.proc;
     2 
     3 public class ArithmeticCalculatorImpl implements ArithmeticCalculator{
     4     public int add(int i, int j) {
     5         int result = i + j;
     6         return result;
     7     }
     8 
     9     public int sub(int i, int j) {
    10         int result = i - j;
    11         return result;
    12     }
    13 
    14     public int mul(int i, int j) {
    15         int result = i * j;
    16         return result;
    17     }
    18 
    19     public int div(int i, int j) {
    20         int result = i / j;
    21         return result;
    22     }
    23 }

    3、LoggingAspect.java 日志切面

     1 package com.proc;
     2 
     3 import org.aspectj.lang.JoinPoint;
     4 import org.aspectj.lang.ProceedingJoinPoint;
     5 import org.aspectj.lang.annotation.After;
     6 import org.aspectj.lang.annotation.AfterReturning;
     7 import org.aspectj.lang.annotation.AfterThrowing;
     8 
     9 
    10 public class LoggingAspect {
    11 
    12     public void beforeMethod(JoinPoint point){
    13         System.out.println("正在执行方法: "+point.getSignature().getName());
    14     }
    15     
    16 
    17     public void afterMethod(JoinPoint point){
    18         System.out.println("方法执行结束: "+point.getSignature().getName());
    19     }
    20     
    21 
    22     public void afterReturningMethod(JoinPoint point,Object retVal){
    23         System.out.println("方法: "+point.getSignature().getName()+"执行结果为:"+retVal);
    24     }
    25     
    26 
    27     public void afterThrowingMethod(JoinPoint point,Exception ex){
    28         System.out.println("执行方法: "+point.getSignature().getName()+"出现了异常:"+ex.getMessage());
    29     }
    30 
    31     public Object aroundMethod(ProceedingJoinPoint point){
    32         
    33         System.out.println("环绕通知: "+point.getSignature().getName());
    34         Object result=null;
    35         //这里相当于前置通知
    36         try {
    37             //执行方法
    38             result= point.proceed();
    39             //这里相当于结果通知
    40         } catch (Throwable e) {
    41             //这里相当于异常通知
    42             e.printStackTrace();
    43             
    44         }
    45         //这里相当于后置通知
    46         System.out.println("环绕通知: "+point.getSignature().getName());
    47         return result;
    48     }
    49 }

    其实这也就是一个普通类,里面定义了写方法

    4、ValidateAspect.java 验证切面

    1 package com.proc;
    2 
    3 import org.aspectj.lang.JoinPoint;
    4 
    5 public class ValidateAspect {
    6     public void beforeMethod(JoinPoint point){
    7         System.out.println("验证前置通知: "+point.getSignature().getName());
    8     }
    9 }

    5、applicationContext.xml配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
     6         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     7 
     8     <bean id="arithmeticCalculator" class="com.proc.ArithmeticCalculatorImpl"/>
     9     <bean id="loggingAspect" class="com.proc.LoggingAspect" />
    10     <bean id="validateAspect" class="com.proc.ValidateAspect"/>
    11     
    12     <aop:config>
    13         <!-- 配置切面表达式 -->
    14         <aop:pointcut expression="execution(* *..*(..))" id="pointcut"/>
    15         
    16         <!-- 配置切面及通知 -->
    17         <aop:aspect ref="loggingAspect" order="1">
    18             <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
    19             <aop:after method="afterMethod" pointcut-ref="pointcut"/>
    20             <aop:after-returning method="afterReturningMethod" pointcut-ref="pointcut"  returning="retVal"/>
    21             <aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="ex"/>
    22             <aop:around method="aroundMethod" pointcut-ref="pointcut" />
    23         </aop:aspect>
    24         
    25         <aop:aspect ref="validateAspect" order="2">
    26             <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
    27         </aop:aspect>
    28     </aop:config>
    29 </beans>

      

    测试代码:

    1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
    2 ArithmeticCalculator calc=(ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
    3 System.out.println(calc.add(3, 5));
    4 System.out.println(calc.sub(3, 5)); 
    5 System.out.println(calc.mul(6, 2)); 
    6 System.out.println(calc.div(6, 2)); 

    输出结果:

    正在执行方法: add
    环绕通知: add
    验证前置通知: add
    环绕通知: add
    方法: add执行结果为:8
    方法执行结束: add
    8
    正在执行方法: sub
    环绕通知: sub
    验证前置通知: sub
    环绕通知: sub
    方法: sub执行结果为:-2
    方法执行结束: sub
    -2
    正在执行方法: mul
    环绕通知: mul
    验证前置通知: mul
    环绕通知: mul
    方法: mul执行结果为:12
    方法执行结束: mul
    12
    正在执行方法: div
    环绕通知: div
    验证前置通知: div
    环绕通知: div
    方法: div执行结果为:3
    方法执行结束: div
    3

  • 相关阅读:
    “.NET研究”带你走进缓存世界 狼人:
    晚绑定场景下对象属性赋值和取值可以不需要Pro“.NET研究”pertyInfo 狼人:
    一“.NET研究”句代码实现批量数据绑定[下篇] 狼人:
    使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例 狼人:
    在ASP.NET MVC3中使用“.NET研究”EFCodeFirst 1.0 狼人:
    一句代码实现批量“.NET研究”数据绑定[下篇] 狼人:
    在ASP.NET M“.NET研究”VC3 中利用JSONP跨域登录WEB系统 狼人:
    一句代码实现批量数“.NET研究”据绑定[上篇] 狼人:
    转发重定向Servlet之请求转发与重定向区别
    估计实例R语言: 极大似然估计实例
  • 原文地址:https://www.cnblogs.com/caoyc/p/5629650.html
Copyright © 2011-2022 走看看