鍍金池/ 教程/ Java/ Spring AOP基于注解的AfterThrowing
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實現
Spring AOP基于注解的Around通知
Spring AOP環(huán)境安裝設置
Spring AOP自定義注解
Spring AOP代理
Spring AOP基于XML的切入點
Spring AOP基于XML的Around Advice
Spring AOP通知類型
Spring AOP基于XML的應用程序
Spring AOP基于注解的After Advice
Spring AOP基于注解的Before Advice
Spring AOP基于注解的AfterThrowing
Spring AOP教程
Spring AOP基于注解的After Returning Advice
Spring AOP核心概念
Spring AOP基于注解的應用

Spring AOP基于注解的AfterThrowing

@AfterThrowing是一種通知類型,可以確保在方法拋出異常時運行一個通知。 以下是@AfterThrowing通知的語法:

語法

@AfterThrowing(pointcut="execution(* com.yiibai.Student.*(..))", throwing= "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
   System.out.println("Method Signature: "  + jp.getSignature());  
   System.out.println("Exception: "+error);  
}

在上面的語法示例中 -

  • @AfterReturning - 如果方法返回成功,則將函數標記為在切入點覆蓋的方法之前執(zhí)行的通知。
  • @Pointcut - 將函數標記為切入點
  • @After - 將函數標記為在切入點覆蓋的方法之后執(zhí)行的通知。
  • execution( expression ) - 涵蓋應用通知的方法的表達式。
  • throwing - 返回的異常名稱。

要了解上面提到的@AfterThrowing通知相關的概念,我們寫一個Spring AOP基于注解的應用例子,它將使用基于注解配置實現通知。打開并使用Eclipse IDE,并按照以下步驟創(chuàng)建一個Spring應用程序:

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

整個項目的目錄結構如下所示 -

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

package com.yiibai;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.annotation.AfterThrowing;  

@Aspect
public class Logging {

   /** 
    * This is the method which I would like to execute
    * after a selected method execution throws exception.
    */
   @AfterThrowing(pointcut="execution(* com.yiibai.Student.*(..))", throwing= "error")
   public void afterThrowingAdvice(JoinPoint jp, Throwable error){
      System.out.println("[afterThrowingAdvice] Method Signature: "  + jp.getSignature());  
      System.out.println("[afterThrowingAdvice] Exception: "+error);  
   }
}

以下是Student.java文件的內容:

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();     
   }
}

以下是MainApp.java文件的內容:

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文件的內容:

<?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:aspectj-autoproxy/>

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

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

</beans>

運行項目

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

Exception raised
[afterThrowingAdvice] Method Signature: void com.yiibai.Student.printThrowException()
[afterThrowingAdvice] Exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
    at com.yiibai.Student.printThrowException(Student.java:25)
    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$$bb5ffc0.printThrowException(<generated>)
    at com.yiibai.MainApp.main(MainApp.java:16)