Spring AOP四种创造通知(拦截器)类型实例

Spring AOP四种创建通知(拦截器)类型实例

1、Spring只支持方法拦截,也就是说,只能在方法的前后进行拦截,而不能在属性前后进行拦截。
2、Spring支持四种拦截类型:目标方法调用前(before),目标方法调用后(after),目标方法调用前后(around),以及目标方法抛出异常(throw)。
3、前置拦截的类必须实现MethodBeforeAdvice接口,实现其中的before方法。
4、后置拦截的类必须实现AfterReturningAdvice接口,实现其中的afterReturning方法。
5、前后拦截的类必须实现MethodInterceptor接口,实现其中的invoke方法。前后拦截是唯一可以控制目标方法是否被真正调用的拦截类型,也可以控制返回对象。而前置拦截或后置拦截不能控制,它们不能印象目标方法的调用和返回。
但是以上的拦截的问题在于,不能对于特定方法进行拦截,而只能对某个类的全部方法作拦截。所以下面引入了两个新概念:“切入点”和“引入通知”。
6、”切入点“的定义相当于更加细化地规定了哪些方法被哪些拦截器所拦截,而并非所有的方法都被所有的拦截器所拦截。在ProxyFactoryBean的属性中,interceptorNames属性的对象也由拦截(Advice)变成了引入通知(Advisor),正是在Advisor中详细定义了切入点(PointCut)和拦截(Advice)的对应关系,比如常见的基于名字的切入点匹配(NameMatchMethodPointcutAdvisor类)和基于正则表达式的切入点匹配(RegExpPointcutAdvisor类)。这些切入点都属于”静态切入点“,因为他们只在代理创建的时候被创建一次,而不是每次运行都创建。

下面我们进行实例的开发

首先创建业务接口: 

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public interface Shopping ...{
Spring AOP四种创造通知(拦截器)类型实例  
public String buySomething(String type);
Spring AOP四种创造通知(拦截器)类型实例  
public String buyAnything(String type);
Spring AOP四种创造通知(拦截器)类型实例  
public void testException();
Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 下面是业务实现类,我们的通知就是以这些实现类作为切面,在业务方法前后加入我们的通知代码 

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public class ShoppingImpl implements Shopping ...{
Spring AOP四种创造通知(拦截器)类型实例    
private Customer customer;
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public Customer getCustomer() ...{
Spring AOP四种创造通知(拦截器)类型实例        
return customer;
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public void setCustomer(Customer customer) ...{
Spring AOP四种创造通知(拦截器)类型实例        
this.customer = customer;
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public String buySomething(String type) ...{
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
this.getCustomer().getName()+" bye "+type+" success");
Spring AOP四种创造通知(拦截器)类型实例        
return null;
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例    
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public String buyAnything(String type) ...{
Spring AOP四种创造通知(拦截器)类型实例       System.out.println(
this.getCustomer().getName()+" bye "+type+" success");
Spring AOP四种创造通知(拦截器)类型实例       
return null;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例     }

Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public void testException()...{
Spring AOP四种创造通知(拦截器)类型实例        
throw new ClassCastException();
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 (1)前置通知

        配置了前置通知的bean,在执行业务方法前,均会执行前置拦截器的before方法

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import java.lang.reflect.Method;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.aop.MethodBeforeAdvice;
Spring AOP四种创造通知(拦截器)类型实例
//前置通知
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public class WelcomeAdvice implements MethodBeforeAdvice ...{
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例    
public void before(Method method, Object[] args, Object obj)
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例            
throws Throwable ...{
Spring AOP四种创造通知(拦截器)类型实例        String type
=(String)args[0];
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"Hello welcome to bye "+type);
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 (2)后置通知

配置了前置通知的bean,在执行业务方法前,均会执行前置拦截器的afterReturnning方法

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import java.lang.reflect.Method;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.aop.AfterReturningAdvice;
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.aop.MethodBeforeAdvice;
Spring AOP四种创造通知(拦截器)类型实例
//后置通知
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public class ThankYouAdvice implements AfterReturningAdvice ...{
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例    
public void afterReturning(Object obj, Method method, Object[] arg1,
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例            Object arg2) 
throws Throwable ...{
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例         String type
=(String)arg1[0];
Spring AOP四种创造通知(拦截器)类型实例         System.out.println(
"Hello Thankyou to bye "+type);
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例    
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 (3)环绕通知

配置了前置通知的bean,在执行业务方法前后,均会执行前置拦截器的invoke方法

需要注意的是必须调用目标方法,如不调用,目标方法将不被执行

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import org.aopalliance.intercept.MethodInterceptor;
Spring AOP四种创造通知(拦截器)类型实例
import org.aopalliance.intercept.MethodInvocation;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public class MethodAdvisor implements MethodInterceptor ...{
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public Object invoke(MethodInvocation invocation) throws Throwable ...{
Spring AOP四种创造通知(拦截器)类型实例        String str
=(String)invocation.getArguments()[0];
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"this is before"+str+" in MethodInterceptor");
Spring AOP四种创造通知(拦截器)类型实例        Object obj
=invocation.proceed(); //调用目标方法,如不调用,目标方法将不被执行
Spring AOP四种创造通知(拦截器)类型实例
        System.out.println("this is after"+str+" in MethodInterceptor");
Spring AOP四种创造通知(拦截器)类型实例        
return null;
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 (4)异常通知

ThrowsAdvice是一个标示接口,我们可以在类中定义一个或多个,来捕获定义异常通知的bean抛出的异常,并在抛出异常前执行相应的方法

public void afterThrowing(Throwable throwa){}或者

public void afterThrowing(Method method,Object[] args,Object target,Throwable throwable){

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.aop.ThrowsAdvice;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public  class ExceptionAdvisor implements ThrowsAdvice ...{
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例  
public void afterThrowing(ClassCastException e)...{
Spring AOP四种创造通知(拦截器)类型实例      System.out.println(
"this is from exceptionAdvisor");
Spring AOP四种创造通知(拦截器)类型实例  }

Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 配置文件 

Spring AOP四种创造通知(拦截器)类型实例<?xml version="1.0" encoding="UTF-8"?>
Spring AOP四种创造通知(拦截器)类型实例
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
Spring AOP四种创造通知(拦截器)类型实例
<beans>
Spring AOP四种创造通知(拦截器)类型实例 
<bean id="customer" class="AdvisorTest.Customer">
Spring AOP四种创造通知(拦截器)类型实例   
<constructor-arg index="0">
Spring AOP四种创造通知(拦截器)类型实例     
<value>gaoxiang</value>
Spring AOP四种创造通知(拦截器)类型实例   
</constructor-arg>
Spring AOP四种创造通知(拦截器)类型实例    
<constructor-arg index="1">
Spring AOP四种创造通知(拦截器)类型实例     
<value>26</value>
Spring AOP四种创造通知(拦截器)类型实例   
</constructor-arg>
Spring AOP四种创造通知(拦截器)类型实例 
</bean>
Spring AOP四种创造通知(拦截器)类型实例 
Spring AOP四种创造通知(拦截器)类型实例 
<bean id="shoppingImpl" class="AdvisorTest.ShoppingImpl">
Spring AOP四种创造通知(拦截器)类型实例   
<property name="customer">
Spring AOP四种创造通知(拦截器)类型实例     
<ref local="customer"/>
Spring AOP四种创造通知(拦截器)类型实例   
</property>
Spring AOP四种创造通知(拦截器)类型实例 
</bean>
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
<!-- 前置通知 -->
Spring AOP四种创造通知(拦截器)类型实例
<bean id="welcomeAdvice" class="AdvisorTest.WelcomeAdvice"/>
Spring AOP四种创造通知(拦截器)类型实例
<bean id="welcomeAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
Spring AOP四种创造通知(拦截器)类型实例  
<property name="proxyInterfaces">
Spring AOP四种创造通知(拦截器)类型实例    
<value>AdvisorTest.Shopping</value>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="target">
Spring AOP四种创造通知(拦截器)类型实例    
<ref local="shoppingImpl"/>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="interceptorNames">
Spring AOP四种创造通知(拦截器)类型实例    
<list>
Spring AOP四种创造通知(拦截器)类型实例      
<value>welcomeAdvice</value>
Spring AOP四种创造通知(拦截器)类型实例    
</list>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
Spring AOP四种创造通知(拦截器)类型实例
</bean>
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
<!-- 后置通知 -->
Spring AOP四种创造通知(拦截器)类型实例
<bean id="thankyouAdvice" class="AdvisorTest.ThankYouAdvice"/>
Spring AOP四种创造通知(拦截器)类型实例
<bean id="thankyouAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
Spring AOP四种创造通知(拦截器)类型实例  
<property name="proxyInterfaces">
Spring AOP四种创造通知(拦截器)类型实例    
<value>AdvisorTest.Shopping</value>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="target">
Spring AOP四种创造通知(拦截器)类型实例    
<ref local="shoppingImpl"/>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="interceptorNames">
Spring AOP四种创造通知(拦截器)类型实例    
<list>
Spring AOP四种创造通知(拦截器)类型实例      
<value>thankyouAdvice</value>
Spring AOP四种创造通知(拦截器)类型实例    
</list>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
Spring AOP四种创造通知(拦截器)类型实例
</bean>
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
<!-- 环绕通知 -->
Spring AOP四种创造通知(拦截器)类型实例
<bean id="methodAdvice" class="AdvisorTest.MethodAdvisor"/>
Spring AOP四种创造通知(拦截器)类型实例
<bean id="methodAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
Spring AOP四种创造通知(拦截器)类型实例  
<property name="proxyInterfaces">
Spring AOP四种创造通知(拦截器)类型实例    
<value>AdvisorTest.Shopping</value>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="target">
Spring AOP四种创造通知(拦截器)类型实例    
<ref local="shoppingImpl"/>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="interceptorNames">
Spring AOP四种创造通知(拦截器)类型实例    
<list>
Spring AOP四种创造通知(拦截器)类型实例      
<value>methodAdvice</value>
Spring AOP四种创造通知(拦截器)类型实例  
Spring AOP四种创造通知(拦截器)类型实例    
</list>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例
</bean>
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
<!-- 异常通知 -->
Spring AOP四种创造通知(拦截器)类型实例
<bean id="exceptionAdvice" class="AdvisorTest.ExceptionAdvisor"/>
Spring AOP四种创造通知(拦截器)类型实例
<bean id="exceptionAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
Spring AOP四种创造通知(拦截器)类型实例  
<property name="proxyInterfaces">
Spring AOP四种创造通知(拦截器)类型实例    
<value>AdvisorTest.Shopping</value>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="target">
Spring AOP四种创造通知(拦截器)类型实例    
<ref local="shoppingImpl"/>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例  
<property name="interceptorNames">
Spring AOP四种创造通知(拦截器)类型实例    
<list>
Spring AOP四种创造通知(拦截器)类型实例      
<value>exceptionAdvice</value>
Spring AOP四种创造通知(拦截器)类型实例  
Spring AOP四种创造通知(拦截器)类型实例    
</list>
Spring AOP四种创造通知(拦截器)类型实例  
</property>
Spring AOP四种创造通知(拦截器)类型实例
</bean>
Spring AOP四种创造通知(拦截器)类型实例
</beans>
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例

 测试代码:

Spring AOP四种创造通知(拦截器)类型实例package AdvisorTest;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import java.io.File;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.beans.factory.BeanFactory;
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.beans.factory.xml.XmlBeanFactory;
Spring AOP四种创造通知(拦截器)类型实例
import org.springframework.core.io.FileSystemResource;
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例
public class TestAdvisor ...{
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例Spring AOP四种创造通知(拦截器)类型实例    
public static void main(String[] args) ...{
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例        String filePath
=System.getProperty("user.dir")+File.separator+"AdvisorTest"+File.separator+"hello.xml";
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        BeanFactory factory
=new XmlBeanFactory(new FileSystemResource(filePath));
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        Shopping shopping
=null;
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"不使用任何通知");
Spring AOP四种创造通知(拦截器)类型实例        shopping
=(Shopping)factory.getBean("shoppingImpl");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buySomething(
"something");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buyAnything(
"anything");
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"使用前置通知");
Spring AOP四种创造通知(拦截器)类型实例        shopping
=(Shopping)factory.getBean("welcomeAdviceShop");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buySomething(
"something");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buyAnything(
"anything");
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"使用后置通知");
Spring AOP四种创造通知(拦截器)类型实例        shopping
=(Shopping)factory.getBean("thankyouAdviceShop");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buySomething(
"something");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buyAnything(
"anything");
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"使用环绕通知");
Spring AOP四种创造通知(拦截器)类型实例        shopping
=(Shopping)factory.getBean("methodAdviceShop");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buySomething(
"something");
Spring AOP四种创造通知(拦截器)类型实例        shopping.buyAnything(
"anything");
Spring AOP四种创造通知(拦截器)类型实例        
Spring AOP四种创造通知(拦截器)类型实例        System.out.println(
"使用异常通知");
Spring AOP四种创造通知(拦截器)类型实例        shopping
=(Shopping)factory.getBean("exceptionAdviceShop");
Spring AOP四种创造通知(拦截器)类型实例        shopping.testException();
Spring AOP四种创造通知(拦截器)类型实例    
Spring AOP四种创造通知(拦截器)类型实例
Spring AOP四种创造通知(拦截器)类型实例    }

Spring AOP四种创造通知(拦截器)类型实例}

Spring AOP四种创造通知(拦截器)类型实例

 运行结果一目了然:

不使用任何通知
gaoxiang bye something success
gaoxiang bye anything success
使用前置通知
Hello welcome to bye something
gaoxiang bye something success
Hello welcome to bye anything
gaoxiang bye anything success
使用后置通知
gaoxiang bye something success
Hello Thankyou to bye something
gaoxiang bye anything success
Hello Thankyou to bye anything
使用环绕通知
this is beforesomething in MethodInterceptor
gaoxiang bye something success
this is aftersomething in MethodInterceptor
this is beforeanything in MethodInterceptor
gaoxiang bye anything success
this is afteranything in MethodInterceptor
使用异常通知
this is from exceptionAdvisor
2007-5-18 22:16:51 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [E:/项目/SpringInActionStudy/AdvisorTest/hello.xml]
Exception in thread "main" java.lang.ClassCastException
 at AdvisorTest.ShoppingImpl.testException(ShoppingImpl.java:22)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
 at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 at $Proxy0.testException(Unknown Source)
 at AdvisorTest.TestAdvisor.main(TestAdvisor.java:42)