zoukankan      html  css  js  c++  java
  • [转载] Spring框架——AOP前置、后置、环绕、异常通知

    通知类型:

    步骤:

    1. 定义接口

    2. 编写对象(被代理对象=目标对象)

    3. 编写通知(前置通知目标方法调用前调用)

    4. 在beans.xml文件配置

    4.1 配置 被代理对象=目标对象

    4.2 配置通知

    4.3 配置代理对象 是 ProxyFactoryBean的对象实例

    4.3.1 <!-- 代理接口集 -->

    4.3.2 织入通知

    4.3.3 配置被代理对象

    本实例:

    1、基本信息:

    包名:com.aop

    两个接口类:TestServiceInter.java;TestServiceInter2.java

    测试类:Test1Service.java实现了上述两个接口

    前置通知类:MyMethodBeforeAdvice.java

    后置通知类:MyAfterReturningAdvice.java

    环绕通知类:MyMethodInterceptor.java

    异常通知类:MyThrowsAdvice.java

    配置文件:beans.xml

    应用操作类:App.java

    2、接口类TestServiceInter.java中代码:

    1.  
      package com.aop;
    2.  
       
    3.  
      public interface TestServiceInter {
    4.  
       
    5.  
      public void sayHello();
    6.  
      }

    3、接口类TestServiceInter2.java中代码:

    1.  
      package com.aop;
    2.  
       
    3.  
      public interface TestServiceInter2 {
    4.  
      public void sayBye();
    5.  
      }

    4、测试类Test1Service.java中代码:

    1.  
      package com.aop;
    2.  
       
    3.  
      public class Test1Service implements TestServiceInter,TestServiceInter2 {
    4.  
       
    5.  
      private String name;
    6.  
      public String getName() {
    7.  
      return name;
    8.  
      }
    9.  
      public void setName(String name) {
    10.  
      this.name = name;
    11.  
      }
    12.  
      public void sayHello() {
    13.  
       
    14.  
      System.out.println("Hello!"+name);
    15.  
       
    16.  
      }
    17.  
      public void sayBye() {
    18.  
      // TODO Auto-generated method stub
    19.  
      System.out.println("Bye!"+name);
    20.  
      }
    21.  
      }

    5、前置通知类MyMethodBeforeAdvice.java中代码:

    1.  
      package com.aop;
    2.  
      import java.lang.reflect.Method;
    3.  
      import org.springframework.aop.MethodBeforeAdvice;
    4.  
       
    5.  
      public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
    6.  
       
    7.  
      @Override//method:表示被调用的方法,args:给这个方法传递的参数;target:目标对象
    8.  
       
    9.  
      public void before(Method method, Object[] args, Object target)
    10.  
      throws Throwable {
    11.  
      // TODO Auto-generated method stub
    12.  
      System.out.println("***************************");
    13.  
      System.out.println("前置通知,记录日志..."+method.getName());
    14.  
      }
    15.  
      }

    6、后置通知类MyAfterReturningAdvice.java中代码:

    1.  
      package com.aop;
    2.  
      import java.lang.reflect.Method;
    3.  
      import org.springframework.aop.AfterReturningAdvice;
    4.  
       
    5.  
      public class MyAfterReturningAdvice implements AfterReturningAdvice {
    6.  
       
    7.  
      @Override
    8.  
      public void afterReturning(Object returnValue, Method method, Object[] args,
    9.  
      Object target) throws Throwable {
    10.  
      // TODO Auto-generated method stub
    11.  
      System.out.println("后置通知,关闭资源...");
    12.  
      }
    13.  
      }

    7、环绕通知类MyMethodInterceptor.java中的代码:

    1.  
      package com.aop;
    2.  
       
    3.  
      import org.aopalliance.intercept.MethodInterceptor;
    4.  
      import org.aopalliance.intercept.MethodInvocation;
    5.  
      public class MyMethodInterceptor implements MethodInterceptor {
    6.  
       
    7.  
      @Override
    8.  
      public Object invoke(MethodInvocation arg0) throws Throwable {
    9.  
      // TODO Auto-generated method stub
    10.  
      System.out.println("环绕通知,调用环绕方法前...");
    11.  
      Object object=arg0.proceed();
    12.  
      System.out.println("环绕通知,调用环绕方法后...");
    13.  
      return null;
    14.  
      }
    15.  
      }

    8、异常通知类MyThrowsAdvice.java中的代码:

    在代码中设置一个异常即可检验出异常通知,例如int a=9/0异常;

    1.  
      package com.aop;
    2.  
       
    3.  
      import java.lang.reflect.Method;
    4.  
      import org.springframework.aop.ThrowsAdvice;
    5.  
       
    6.  
      public class MyThrowsAdvice implements ThrowsAdvice {
    7.  
       
    8.  
      public void afterThrowing(Method m,Object[] os,Object target,Exception e) {
    9.  
       
    10.  
      System.out.println("出异常了..."+e.getMessage());
    11.  
      }
    12.  
      }

    9、配置文件beans.xml中代码:

    1.  
      <!-- 1、配置被代理的对象,该对象实现了接口 -->
    2.  
      <bean id="test1Service" class="com.aop.Test1Service">
    3.  
      <property name="name" value="小明"/>
    4.  
      </bean>
    5.  
      <!-- 2、配置前置通知-->
    6.  
      <bean id ="myMethodBeforeAdvice" class="com.aop.MyMethodBeforeAdvice" />
    7.  
      <!-- 配置后置通知 -->
    8.  
      <bean id="myAfterReturningAdvice" class="com.aop.MyAfterReturningAdvice"/>
    9.  
      <!-- 配置环绕通知 -->
    10.  
      <bean id="myMethodInterceptor" class="com.aop.MyMethodInterceptor"/>
    11.  
      <!-- 配置异常通知 -->
    12.  
      <bean id="myThrowsAdvice" class="com.aop.MyThrowsAdvice"/>
    13.  
      <!-- 定义前置通知的切入点 -->
    14.  
      <bean id="myMethodBeforeAdviceFilter" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    15.  
      <property name="advice" ref="myMethodBeforeAdvice" />
    16.  
      <property name="mappedNames">
    17.  
      <value>sayHello</value>
    18.  
      </property>
    19.  
      </bean>
    20.  
      <!-- 3、配置代理对象,spring提供 -->
    21.  
      <bean id="proxyFactoryBean1" class="org.springframework.aop.framework.ProxyFactoryBean">
    22.  
      <!-- 3.1、配置代理接口集-->
    23.  
      <property name="proxyInterfaces">
    24.  
      <list>
    25.  
      <value>com.aop.TestServiceInter</value>
    26.  
      <value>com.aop.TestServiceInter2</value>
    27.  
      </list>
    28.  
      </property>
    29.  
      <!-- 3.2、把通知织入到代理对象 -->
    30.  
      <property name="interceptorNames">
    31.  
      <list>
    32.  
      <!-- 相当于把前置通知和代理对象关联起来,可以把通知看成拦截器 -->
    33.  
      <!-- 使用自定义切入点来控制前置通知 -->
    34.  
      <!-- <value>myMethodBeforeAdviceFilter</value> -->
    35.  
      <!-- 织入前置通知 -->
    36.  
      <value>myMethodBeforeAdvice</value>
    37.  
      <!-- 织入后置通知 -->
    38.  
      <value>myAfterReturningAdvice</value>
    39.  
      <!-- 织入环绕通知 -->
    40.  
      <value>myMethodInterceptor</value>
    41.  
      <!-- 织入异常通知 -->
    42.  
      <value>myThrowsAdvice</value>
    43.  
      </list>
    44.  
      </property>
    45.  
      <!-- 3.3、配置被代理对象 ,可以指定-->
    46.  
      <property name="target" ref="test1Service"/>
    47.  
      </bean>

    10、应用操作类App.java中代码:

    1.  
      package com.aop;
    2.  
      import org.springframework.context.ApplicationContext;
    3.  
      import org.springframework.context.support.ClassPathXmlApplicationContext;
    4.  
       
    5.  
      public class App {
    6.  
       
    7.  
      public static void main(String[] args) {
    8.  
       
    9.  
      ApplicationContext ac=new ClassPathXmlApplicationContext("com/aop/beans.xml");
    10.  
      TestServiceInter ts=(TestServiceInter)ac.getBean("proxyFactoryBean1");
    11.  
      TestServiceInter2 ts2=(TestServiceInter2)ts;//转接口
    12.  
      ts.sayHello();
    13.  
      ts2.sayBye();
    14.  
      }
    15.  
      }

    11、运行结果:



    12、项目源码:

    http://download.csdn.net/detail/tingzhiyi/9596426

  • 相关阅读:
    《把时间当作朋友》读书笔记
    Oracle&SQLServer中实现跨库查询
    Android学习——界面互调2
    《IT不再重要》读后感
    Android学习——数据存储
    Android学习——编写菜单
    Android学习——后台程序
    Android学习——写个小实例
    Android学习——界面编程!
    深入理解JavaScript系列(42):设计模式之原型模式
  • 原文地址:https://www.cnblogs.com/Snail-1174158844/p/9407735.html
Copyright © 2011-2022 走看看