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

Julywhj 2015-06-24

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四种创建通知(拦截器)类型实例

相关推荐