• Spring AOP 中 advice 的四种类型 before after throwing advice around


    spring  AOP(Aspect-oriented programming) 是用于切面编程,简单的来说:AOP相当于一个拦截器,去拦截一些处理,例如:当一个方法执行的时候,Spring 能够拦截正在执行的方法,在方法执行的前或者后增加额外的功能和处理。

    在Spring AOP中支持4中类型的通知:

    1:before advice 在方法执行前执行。

    2:after  returning  advice 在方法执行后返回一个结果后执行。

    3:after  throwing advice 在方法执行过程中抛出异常的时候执行。

    4:Around  advice 在方法执行前后和抛出异常时执行,相当于综合了以上三种通知。

    下面是一个简单的AOP  advice 的例子:

     首先给出一个简单的Spring 注入的例子,

    定义一个Book类:

    1. package com.myapp.core.aop.advice;  
    2.   
    3. public class Book {  
    4.    private  String  name;  
    5.    private  String  url;  
    6.    private   int    pages;  
    7.      
    8.     public String getName() {  
    9.         return name;  
    10.     }  
    11.     public void setName(String name) {  
    12.         this.name = name;  
    13.     }  
    14.     public String getUrl() {  
    15.         return url;  
    16.     }  
    17.     public void setUrl(String url) {  
    18.         this.url = url;  
    19.     }  
    20.     public int getPages() {  
    21.         return pages;  
    22.     }  
    23.     public void setPages(int pages) {  
    24.         this.pages = pages;  
    25.     }  
    26.   
    27.   
    28.     public  void  printName(){  
    29.         System.out.println("Book name "+ this.name);  
    30.     }  
    31.       
    32.     public  void  printUrl(){  
    33.         System.out.println("Book URL "+this.url);  
    34.     }  
    35.       
    36.     public  void  printThrowException(){  
    37.         throw  new  IllegalArgumentException();  
    38.     }  
    39.      
    40. }  
    package com.myapp.core.aop.advice;
    
    public class Book {
       private  String  name;
       private  String  url;
       private   int    pages;
       
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getUrl() {
    		return url;
    	}
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	public int getPages() {
    		return pages;
    	}
    	public void setPages(int pages) {
    		this.pages = pages;
    	}
    
    
    	public  void  printName(){
    		System.out.println("Book name "+ this.name);
    	}
    	
    	public  void  printUrl(){
    		System.out.println("Book URL "+this.url);
    	}
    	
    	public  void  printThrowException(){
    		throw  new  IllegalArgumentException();
    	}
       
    }
    

    相应的配置文件:

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
    6.   
    7.   <!-- more bean definitions for data access objects go here -->  
    8.      
    9.     <bean id="book" class="com.myapp.core.aop.advice.Book">  
    10.         <property name="name" value="Effective java" />  
    11.         <property name="url" value="www.google.cn"/>  
    12.         <property name="pages" value="300" />  
    13.     </bean>  
    14. </beans>  
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
      <!-- more bean definitions for data access objects go here -->
       
        <bean id="book" class="com.myapp.core.aop.advice.Book">
    	    <property name="name" value="Effective java" />
    	    <property name="url" value="www.google.cn"/>
    	    <property name="pages" value="300" />
        </bean>
    </beans>

    对应的测试类:

    1. package com.myapp.core.aop.advice;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class MainTest {  
    7.    public static void main(String[] args) {  
    8.         
    9.        ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");  
    10.          
    11.        Book   book  =   (Book) context.getBean("book");  
    12.          
    13.        System.out.println("---------------------");  
    14.          
    15.        book.printName();  
    16.          
    17.        System.out.println("---------------------");  
    18.          
    19.        book.printUrl();  
    20.          
    21.        System.out.println("----------------------");  
    22.          
    23.        try{  
    24.              
    25.           book.printThrowException();  
    26.              
    27.        }catch(Exception e){  
    28.          //  e.printStackTrace();  
    29.        }  
    30.          
    31.          
    32. }  
    33. }  
    package com.myapp.core.aop.advice;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainTest {
       public static void main(String[] args) {
    	  
    	   ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");
    	   
    	   Book   book  =   (Book) context.getBean("book");
    	   
    	   System.out.println("---------------------");
           
    	   book.printName();
    	   
    	   System.out.println("---------------------");
    	   
    	   book.printUrl();
    	   
    	   System.out.println("----------------------");
    	   
    	   try{
    		   
    		  book.printThrowException();
    		   
    	   }catch(Exception e){
    		 //  e.printStackTrace();
    	   }
    	   
    	   
    }
    }
    

    输出结果:

    1. 三月 20, 2013 11:01:01 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@11e831: startup date [Wed Mar 20 11:01:01 CST 2013]; root of context hierarchy  
    3. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]  
    5. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13b5500: defining beans [book]; root of factory hierarchy  
    7. ---------------------  
    8. Book name Effective java  
    9. ---------------------  
    10. Book URL www.google.cn  
    11. ----------------------  
    三月 20, 2013 11:01:01 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@11e831: startup date [Wed Mar 20 11:01:01 CST 2013]; root of context hierarchy
    三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
    三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13b5500: defining beans [book]; root of factory hierarchy
    ---------------------
    Book name Effective java
    ---------------------
    Book URL www.google.cn
    ----------------------
    

    下面对以上的Book加上Spring   AOP   advices

    1:before  advice

    before advice将在方法执行前执行,创建一个实现MethodBeforeAdvice接口的类能够定义执行方法前的操作。
    类如下:
    1. package com.myapp.core.aop.advice;  
    2.   
    3. import java.lang.reflect.Method;  
    4.   
    5. import org.springframework.aop.MethodBeforeAdvice;  
    6.   
    7. public class BeforeMethod  implements MethodBeforeAdvice {  
    8.   
    9.     @Override  
    10.     public void before(Method arg0, Object[] arg1, Object arg2)  
    11.             throws Throwable {  
    12.         // TODO Auto-generated method stub  
    13.           
    14.         System.out.println("Before  Method");  
    15.         System.out.println("--------------------");  
    16.           
    17.     }  
    18.    
    19. }  
    package com.myapp.core.aop.advice;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.MethodBeforeAdvice;
    
    public class BeforeMethod  implements MethodBeforeAdvice {
    
    	@Override
    	public void before(Method arg0, Object[] arg1, Object arg2)
    			throws Throwable {
    		// TODO Auto-generated method stub
    		
    		System.out.println("Before  Method");
    		System.out.println("--------------------");
    		
    	}
     
    }
    
    配置对应的bean:
    在aop.xml中配置,创建一个BeforeMethod类,一个新的代理命名为:bookProxy
    1: target 设置你想拦截的bean
    2:interceptorNames设置通知,你想作用于proxy/target上的
    对应的配置文件如下:
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
    6.   
    7.   <!-- more bean definitions for data access objects go here -->  
    8.      
    9.     <bean id="book" class="com.myapp.core.aop.advice.Book">  
    10.         <property name="name" value="Effective java" />  
    11.         <property name="url" value="www.google.cn"/>  
    12.         <property name="pages" value="300" />  
    13.     </bean>  
    14.       
    15.     <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />  
    16.       
    17.     <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
    18.        
    19.      <property name="target" ref="book"/>  
    20.        
    21.      <property name="interceptorNames">  
    22.        <list>  
    23.         <value>beforeMethodBean</value>  
    24.        </list>  
    25.      </property>  
    26.       
    27.      </bean>  
    28. </beans>  
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
      <!-- more bean definitions for data access objects go here -->
       
        <bean id="book" class="com.myapp.core.aop.advice.Book">
    	    <property name="name" value="Effective java" />
    	    <property name="url" value="www.google.cn"/>
    	    <property name="pages" value="300" />
        </bean>
        
        <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
        
        <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
         
         <property name="target" ref="book"/>
         
         <property name="interceptorNames">
           <list>
            <value>beforeMethodBean</value>
           </list>
         </property>
        
         </bean>
    </beans>
    注意:为了使用proxy(代理)我们需要引入 CGLIB2, pom.xml文件中注入如下:
    1. <dependency>  
    2.     <groupId>cglib</groupId>  
    3.     <artifactId>cglib</artifactId>  
    4.     <version>2.2.2</version>  
    5. </dependency>  
    	<dependency>
    		<groupId>cglib</groupId>
    		<artifactId>cglib</artifactId>
    		<version>2.2.2</version>
    	</dependency>
    运行测试类:
    1. package com.myapp.core.aop.advice;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class MainTest {  
    7.    public static void main(String[] args) {  
    8.         
    9.        ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");  
    10.          
    11.        Book   book  =   (Book) context.getBean("bookProxy");  
    12.          
    13.        System.out.println("---------------------");  
    14.          
    15.        book.printName();  
    16.          
    17.        System.out.println("---------------------");  
    18.          
    19.        book.printUrl();  
    20.          
    21.        System.out.println("----------------------");  
    22.          
    23.        try{  
    24.              
    25.           book.printThrowException();  
    26.              
    27.        }catch(Exception e){  
    28.          //  e.printStackTrace();  
    29.        }  
    30.          
    31.          
    32. }  
    33. }  
    package com.myapp.core.aop.advice;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainTest {
       public static void main(String[] args) {
    	  
    	   ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");
    	   
    	   Book   book  =   (Book) context.getBean("bookProxy");
    	   
    	   System.out.println("---------------------");
           
    	   book.printName();
    	   
    	   System.out.println("---------------------");
    	   
    	   book.printUrl();
    	   
    	   System.out.println("----------------------");
    	   
    	   try{
    		   
    		  book.printThrowException();
    		   
    	   }catch(Exception e){
    		 //  e.printStackTrace();
    	   }
    	   
    	   
    }
    }
    注意以上获得的是代理bean;
    运行结果如下:
    1. 三月 20, 2013 2:18:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:18:55 CST 2013]; root of context hierarchy  
    3. 三月 20, 2013 2:18:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]  
    5. 三月 20, 2013 2:18:57 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,bookProxy]; root of factory hierarchy  
    7. ---------------------  
    8. Before  Method  
    9. --------------------  
    10. Book name Effective java  
    11. ---------------------  
    12. Before  Method  
    13. --------------------  
    14. Book URL www.google.cn  
    15. ----------------------  
    16. Before  Method  
    17. --------------------  
    三月 20, 2013 2:18:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:18:55 CST 2013]; root of context hierarchy
    三月 20, 2013 2:18:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
    三月 20, 2013 2:18:57 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,bookProxy]; root of factory hierarchy
    ---------------------
    Before  Method
    --------------------
    Book name Effective java
    ---------------------
    Before  Method
    --------------------
    Book URL www.google.cn
    ----------------------
    Before  Method
    --------------------

    2: after  advice

    在方法运行返回结果后将执行这个 afterReturning方法,创建的这个类必须实现:AfterReturningAdvice接口
    1. package com.myapp.core.aop.advice;  
    2.   
    3. import java.lang.reflect.Method;  
    4.   
    5. import org.springframework.aop.AfterReturningAdvice;  
    6.   
    7. public class AfterMethod  implements  AfterReturningAdvice {  
    8.   
    9.     @Override  
    10.     public void afterReturning(Object arg0, Method arg1, Object[] arg2,  
    11.             Object arg3) throws Throwable {  
    12.         // TODO Auto-generated method stub  
    13.           
    14.         System.out.println("-------------------");  
    15.           
    16.         System.out.println("After  method ");  
    17.           
    18.           
    19.           
    20.     }  
    21.   
    22. }  
    package com.myapp.core.aop.advice;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.AfterReturningAdvice;
    
    public class AfterMethod  implements  AfterReturningAdvice {
    
    	@Override
    	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
    			Object arg3) throws Throwable {
    		// TODO Auto-generated method stub
    		
    		System.out.println("-------------------");
    		
    		System.out.println("After  method ");
    		
    		
    		
    	}
    
    }
    
    xml配置文件:
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
    6.   
    7.   <!-- more bean definitions for data access objects go here -->  
    8.      
    9.     <bean id="book" class="com.myapp.core.aop.advice.Book">  
    10.         <property name="name" value="Effective java" />  
    11.         <property name="url" value="www.google.cn"/>  
    12.         <property name="pages" value="300" />  
    13.     </bean>  
    14.       
    15.     <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />  
    16.       
    17.       <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />  
    18.       
    19.     <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
    20.        
    21.      <property name="target" ref="book"/>  
    22.        
    23.      <property name="interceptorNames">  
    24.        <list>  
    25.         <value>beforeMethodBean</value>  
    26.         <value>afterMethodBean</value>  
    27.        </list>  
    28.      </property>  
    29.       
    30.      </bean>  
    31. </beans>  
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
      <!-- more bean definitions for data access objects go here -->
       
        <bean id="book" class="com.myapp.core.aop.advice.Book">
    	    <property name="name" value="Effective java" />
    	    <property name="url" value="www.google.cn"/>
    	    <property name="pages" value="300" />
        </bean>
        
        <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
        
          <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
        
        <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
         
         <property name="target" ref="book"/>
         
         <property name="interceptorNames">
           <list>
            <value>beforeMethodBean</value>
            <value>afterMethodBean</value>
           </list>
         </property>
        
         </bean>
    </beans>
    运行结果如下:
    1. 三月 20, 2013 2:22:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:22:19 CST 2013]; root of context hierarchy  
    3. 三月 20, 2013 2:22:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]  
    5. 三月 20, 2013 2:22:20 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,bookProxy]; root of factory hierarchy  
    7. ---------------------  
    8. Before  Method  
    9. --------------------  
    10. Book name Effective java  
    11. -------------------  
    12. After  method   
    13. ---------------------  
    14. Before  Method  
    15. --------------------  
    16. Book URL www.google.cn  
    17. -------------------  
    18. After  method   
    19. ----------------------  
    20. Before  Method  
    21. --------------------  
    三月 20, 2013 2:22:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:22:19 CST 2013]; root of context hierarchy
    三月 20, 2013 2:22:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
    三月 20, 2013 2:22:20 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,bookProxy]; root of factory hierarchy
    ---------------------
    Before  Method
    --------------------
    Book name Effective java
    -------------------
    After  method 
    ---------------------
    Before  Method
    --------------------
    Book URL www.google.cn
    -------------------
    After  method 
    ----------------------
    Before  Method
    --------------------

    3:after  throwing  advice 

    当方法执行抛出一个异常后,会执行这个方法,创建一个类实现:ThrowsAdvice接口,创建一个afterThrowing拦截:IllegalArgumentException异常。
    类如下:
    1. package com.myapp.core.aop.advice;  
    2.   
    3. import org.springframework.aop.ThrowsAdvice;  
    4.   
    5. public class ThrowException  implements ThrowsAdvice{  
    6.      
    7.     public  void  afterThrowing(IllegalArgumentException e)  throws  Throwable{  
    8.         System.out.println("after Throwing  Exception");  
    9.     }  
    10. }  
    package com.myapp.core.aop.advice;
    
    import org.springframework.aop.ThrowsAdvice;
    
    public class ThrowException  implements ThrowsAdvice{
       
    	public  void  afterThrowing(IllegalArgumentException e)  throws  Throwable{
    		System.out.println("after Throwing  Exception");
    	}
    }
    
    xml中配置文件如下:
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
    6.   
    7.   <!-- more bean definitions for data access objects go here -->  
    8.      
    9.     <bean id="book" class="com.myapp.core.aop.advice.Book">  
    10.         <property name="name" value="Effective java" />  
    11.         <property name="url" value="www.google.cn"/>  
    12.         <property name="pages" value="300" />  
    13.     </bean>  
    14.       
    15.     <!-- before  advice -->  
    16.     <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />  
    17.       
    18.     <!-- after  advice -->  
    19.       <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />  
    20.         
    21.       <!-- throwing  advice -->  
    22.         
    23.       <bean id="throwException" class="com.myapp.core.aop.advice.ThrowException" />  
    24.       
    25.     <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
    26.        
    27.      <property name="target" ref="book"/>  
    28.        
    29.      <property name="interceptorNames">  
    30.        <list>  
    31.         <value>beforeMethodBean</value>  
    32.         <value>afterMethodBean</value>  
    33.         <value>throwException</value>  
    34.        </list>  
    35.      </property>  
    36.       
    37.      </bean>  
    38. </beans>  
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
      <!-- more bean definitions for data access objects go here -->
       
        <bean id="book" class="com.myapp.core.aop.advice.Book">
    	    <property name="name" value="Effective java" />
    	    <property name="url" value="www.google.cn"/>
    	    <property name="pages" value="300" />
        </bean>
        
        <!-- before  advice -->
        <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
        
        <!-- after  advice -->
          <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
          
          <!-- throwing  advice -->
          
          <bean id="throwException" class="com.myapp.core.aop.advice.ThrowException" />
        
        <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
         
         <property name="target" ref="book"/>
         
         <property name="interceptorNames">
           <list>
            <value>beforeMethodBean</value>
            <value>afterMethodBean</value>
            <value>throwException</value>
           </list>
         </property>
        
         </bean>
    </beans>
    执行结果如下:
    1. 三月 20, 2013 2:37:36 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:37:36 CST 2013]; root of context hierarchy  
    3. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]  
    5. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,throwException,bookProxy]; root of factory hierarchy  
    7. ---------------------  
    8. Before  Method  
    9. --------------------  
    10. Book name Effective java  
    11. -------------------  
    12. After  method   
    13. ---------------------  
    14. Before  Method  
    15. --------------------  
    16. Book URL www.google.cn  
    17. -------------------  
    18. After  method   
    19. ----------------------  
    20. Before  Method  
    21. --------------------  
    22. after Throwing  Exception  
    三月 20, 2013 2:37:36 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:37:36 CST 2013]; root of context hierarchy
    三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
    三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,throwException,bookProxy]; root of factory hierarchy
    ---------------------
    Before  Method
    --------------------
    Book name Effective java
    -------------------
    After  method 
    ---------------------
    Before  Method
    --------------------
    Book URL www.google.cn
    -------------------
    After  method 
    ----------------------
    Before  Method
    --------------------
    after Throwing  Exception
    

    4:Around  advice

    这个advice 联合了上面的三个advices,在方法执行期间执行,创建一个类实现MethodInterceptor接口,需要在方法中执行Object result = methodInvocation.proceed();方法才能得到执行,否则方法不会执行。
    类如下:
    1. package com.myapp.core.aop.advice;  
    2.   
    3. import java.util.Arrays;  
    4.   
    5. import org.aopalliance.intercept.MethodInterceptor;  
    6. import org.aopalliance.intercept.MethodInvocation;  
    7.   
    8. public class AroundMethod  implements MethodInterceptor{  
    9.   
    10.     @Override  
    11.     public Object invoke(MethodInvocation methodInvocation) throws Throwable {  
    12.         // TODO Auto-generated method stub  
    13.           
    14.         System.out.println("method  name:" + methodInvocation.getMethod().getName());  
    15.           
    16.         System.out.println("method  arguments" + Arrays.toString(methodInvocation.getArguments()));  
    17.           
    18.         System.out.println("Around  method : before ");  
    19.           
    20.         try{  
    21.               
    22.             Object result = methodInvocation.proceed();  
    23.               
    24.             System.out.println("Around method : after ");  
    25.             return  result;  
    26.               
    27.         }catch(IllegalArgumentException e){  
    28.               
    29.             System.out.println("Around method : throw  an  exception ");  
    30.             throw  e;  
    31.         }  
    32.     }  
    33.   
    34. }  
    package com.myapp.core.aop.advice;
    
    import java.util.Arrays;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class AroundMethod  implements MethodInterceptor{
    
    	@Override
    	public Object invoke(MethodInvocation methodInvocation) throws Throwable {
    		// TODO Auto-generated method stub
    		
    		System.out.println("method  name:" + methodInvocation.getMethod().getName());
    		
    		System.out.println("method  arguments" + Arrays.toString(methodInvocation.getArguments()));
    		
    		System.out.println("Around  method : before ");
    		
    		try{
    			
    			Object result = methodInvocation.proceed();
    			
    			System.out.println("Around method : after ");
    			return  result;
    			
    		}catch(IllegalArgumentException e){
    			
    			System.out.println("Around method : throw  an  exception ");
    			throw  e;
    		}
    	}
    
    }
    配置文件如下:
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
    6.   
    7.   <!-- more bean definitions for data access objects go here -->  
    8.      
    9.     <bean id="book" class="com.myapp.core.aop.advice.Book">  
    10.         <property name="name" value="Effective java" />  
    11.         <property name="url" value="www.google.cn"/>  
    12.         <property name="pages" value="300" />  
    13.     </bean>  
    14.     
    15.     <bean id="aroundMethod"  class="com.myapp.core.aop.advice.AroundMethod" />  
    16.       
    17.     <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >  
    18.      <property name="target" ref="book"/>  
    19.        
    20.      <property name="interceptorNames">  
    21.        <list>  
    22.       
    23.          <value>aroundMethod</value>  
    24.        </list>  
    25.      </property>  
    26.       
    27.      </bean>  
    28. </beans>  
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
      <!-- more bean definitions for data access objects go here -->
       
        <bean id="book" class="com.myapp.core.aop.advice.Book">
    	    <property name="name" value="Effective java" />
    	    <property name="url" value="www.google.cn"/>
    	    <property name="pages" value="300" />
        </bean>
      
        <bean id="aroundMethod"  class="com.myapp.core.aop.advice.AroundMethod" />
        
        <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
         <property name="target" ref="book"/>
         
         <property name="interceptorNames">
           <list>
        
             <value>aroundMethod</value>
           </list>
         </property>
        
         </bean>
    </beans>
    测试结果:
    1. 三月 20, 2013 3:02:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 15:02:19 CST 2013]; root of context hierarchy  
    3. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]  
    5. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e29127: defining beans [book,aroundMethod,bookProxy]; root of factory hierarchy  
    7. ---------------------  
    8. method  name:printName  
    9. method  arguments[]  
    10. Around  method : before   
    11. Book name Effective java  
    12. Around method : after   
    13. ---------------------  
    14. method  name:printUrl  
    15. method  arguments[]  
    16. Around  method : before   
    17. Book URL www.google.cn  
    18. Around method : after   
    19. ----------------------  
    20. method  name:printThrowException  
    21. method  arguments[]  
    22. Around  method : before   
    23. Around method : throw  an  exception   
    三月 20, 2013 3:02:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 15:02:19 CST 2013]; root of context hierarchy
    三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
    三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e29127: defining beans [book,aroundMethod,bookProxy]; root of factory hierarchy
    ---------------------
    method  name:printName
    method  arguments[]
    Around  method : before 
    Book name Effective java
    Around method : after 
    ---------------------
    method  name:printUrl
    method  arguments[]
    Around  method : before 
    Book URL www.google.cn
    Around method : after 
    ----------------------
    method  name:printThrowException
    method  arguments[]
    Around  method : before 
    Around method : throw  an  exception 
    
    around  advice得到实现。 over
  • 相关阅读:
    生成器
    各种表达式
    迭代器
    闭包函数及装饰器
    名称空间及作用域
    函数的嵌套
    函数对象
    OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例
    PHP函数usort是咋回事?还能当后门?
    CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
  • 原文地址:https://www.cnblogs.com/mochaMM/p/6932735.html
Copyright © 2020-2023  润新知