鍍金池/ 教程/ Java/ Spring AOP基于XML的After Throwing Advice
Spring AOP基于XML的After Advice
Spring AOP基于XML的Before Advice
Spring AOP基于XML的After Returning Advice
Spring AOP基于注解的切入點
Spring AOP基于XML的After Throwing Advice
Spring AOP實現(xiàn)
Spring AOP基于注解的Around通知
Spring AOP環(huán)境安裝設(shè)置
Spring AOP自定義注解
Spring AOP代理
Spring AOP基于XML的切入點
Spring AOP基于XML的Around Advice
Spring AOP通知類型
Spring AOP基于XML的應(yīng)用程序
Spring AOP基于注解的After Advice
Spring AOP基于注解的Before Advice
Spring AOP基于注解的AfterThrowing
Spring AOP教程
Spring AOP基于注解的After Returning Advice
Spring AOP核心概念
Spring AOP基于注解的應(yīng)用

Spring AOP基于XML的After Throwing Advice

after-throwing是一種通知類型,只有在方法通過拋出異常退出時才能確保方法執(zhí)行后才能運行通知。 以下是after-throwing通知的語法:

語法

<aop:config>
   <aop:aspect id="log" ref="logging">
      <aop:pointcut id="pointcut-id" expression="execution( expression )"/>    
      <aop:after-throwing pointcut-ref="pointcut-id" throwing="ex" method="methodName"/>
   </aop:aspect>
   </aop:config>

在上面配置中,

  • pointcut-id - 切入點的id。
  • ex - 要被被拋出例外。
  • methodName - 在調(diào)用函數(shù)之前調(diào)用的函數(shù)的方法名稱。

要了解上述與之后拋出通知(After Throwing Advice)相關(guān)的概念,寫一個在實現(xiàn)之后拋出通知(After Throwing Advice)的示例。為了簡單,可直接復(fù)制之前上一篇文章中的例子,打開并使用Eclipse IDE,并按照以下步驟創(chuàng)建一個Spring應(yīng)用程序:

  1. 更新在Spring AOP應(yīng)用實例中創(chuàng)建過的Student項目。
  2. 更新bean配置并運行應(yīng)用程序,如下所述。

整個項目的目錄結(jié)構(gòu)如下所示 -

下面是Logging.java文件的內(nèi)容。 這實際上是一個Aspect模塊的樣本,它定義了在各個點被調(diào)用的方法。

package com.yiibai;

public class Logging {
    /**
    * This is the method which I would like to execute
    * if there is an exception raised.
    */
   public void afterThrowingAdvice(IllegalArgumentException ex){
      System.out.println("[afterThrowingAdvice] There has been an exception: " + ex.toString());   
   } 
}

以下是Student.java文件的內(nèi)容:

package com.yiibai;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }

   public void printThrowException(){
       System.out.println("Exception raised");
       throw new IllegalArgumentException();
   }
}

以下是MainApp.java文件的內(nèi)容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.printThrowException();     
   }
}

以下是配置文件Beans.xml文件的內(nèi)容:

<?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:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id="log" ref="logging">
         <aop:pointcut id="selectAll" 
         expression="execution(* com.yiibai.*.*(..))"/>
         <aop:after-throwing pointcut-ref="selectAll" throwing="ex" method="afterThrowingAdvice"/>         
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id="student" class="com.yiibai.Student">
        <property name="name" value="maxsu" />
        <property name="age" value="25" />
    </bean>

   <!-- Definition for logging aspect -->
   <bean id="logging" class="com.yiibai.Logging"/> 

</beans>

運行項目

完成創(chuàng)建源代碼和配置文件后,運行應(yīng)用程序。右鍵單擊應(yīng)用程序中的MainApp.java,并使用運行方式作為Java應(yīng)用程序命令。 如果您的應(yīng)用程序一切正常,這將打印以下消息:

Exception raised
[afterThrowingAdvice] There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
    at com.yiibai.Student.printThrowException(Student.java:27)
    at com.yiibai.Student$$FastClassBySpringCGLIB$$e9280b4b.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
    at com.yiibai.Student$$EnhancerBySpringCGLIB$$47620070.printThrowException(<generated>)
    at com.yiibai.MainApp.main(MainApp.java:13)