现在的位置: 首页 > 综合 > 正文

一个简单的spring AOP例子

2014年06月29日 ⁄ 综合 ⁄ 共 4809字 ⁄ 字号 评论关闭

转自:http://meiowei.iteye.com/blog/413919

这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。写这个例子的主要目标只是想让想学AOP的能更快地入门,了解一下如何去配置AOP里面的东东。 
目标对象的接口:IStudent.java

 

Java代码  收藏代码
  1.  1   /** 
  2.  2  *  
  3.  3   */   
  4.  4  package  com.dragon.study;  
  5.  5    
  6.  6   /**  
  7.  7  *  @author  dragon 
  8.  8  * 
  9.  9   */   
  10. 10   public   interface  IStudent   {  
  11. 11       
  12. 12      public   void  addStudent(String name);  
  13. 13 }   

 

目标类:StudentImpl.java

Java代码  收藏代码
  1. 1    /**  
  2.  2  *  
  3.  3   */   
  4.  4  package  com.dragon.study.Impl;  
  5.  5    
  6.  6  import  com.dragon.study.IStudent;  
  7.  7    
  8.  8    /**  
  9.  9  *  @author  dragon 
  10. 10  * 
  11. 11   */   
  12. 12   public   class  StudentImpl  implements  IStudent  {  
  13. 13    
  14. 14        public   void  addStudent(String name)  {  
  15. 15          System.out.println( " 欢迎  " + name + "  你加入Spring家庭! " );  
  16. 16      }   
  17. 17 }   
  18. 18   

 

前置通知:BeforeAdvice.java

Java代码  收藏代码
  1. 1    /**  
  2.  2  *  
  3.  3   */   
  4.  4  package  com.dragon.Advice;  
  5.  5    
  6.  6  import  java.lang.reflect.Method;  
  7.  7    
  8.  8  import  org.springframework.aop.MethodBeforeAdvice;  
  9.  9    
  10. 10    /**  
  11. 11  *  @author  dragon 
  12. 12  * 
  13. 13   */   
  14. 14   public   class  BeforeAdvice  implements  MethodBeforeAdvice  {  
  15. 15    
  16. 16        public   void  before(Method method,Object[] args, Object target)  
  17. 17                  throws  Throwable  {  
  18. 18             
  19. 19           System.out.println( " 这是BeforeAdvice类的before方法. " );  
  20. 20             
  21. 21       }   
  22. 22 }   

 

后置通知:AfterAdvice.java

Java代码  收藏代码
  1. 1/** 
  2.  2 *  
  3.  3 */  
  4.  4package com.dragon.Advice;  
  5.  5  
  6.  6import java.lang.reflect.Method;  
  7.  7  
  8.  8import org.springframework.aop.AfterReturningAdvice;  
  9.  9  
  10. 10/** 
  11. 11 * @author dragon 
  12. 12 * 
  13. 13 */  
  14. 14public class AfterAdvice implements AfterReturningAdvice{  
  15. 15      
  16. 16    public void afterReturning(Object returnValue ,Method method,  
  17. 17                   Object[] args,Object target) throws Throwable{  
  18. 18        System.out.println("这是AfterAdvice类的afterReturning方法.");  
  19. 19    }  
  20. 20        
  21. 21  
  22. 22}  

 

环绕通知:CompareInterceptor.java

Java代码  收藏代码
  1. 1/** 
  2.  2 *  
  3.  3 */  
  4.  4package com.dragon.Advice;  
  5.  5  
  6.  6import org.aopalliance.intercept.MethodInterceptor;  
  7.  7import org.aopalliance.intercept.MethodInvocation;  
  8.  8  
  9.  9  
  10. 10/** 
  11. 11 * @author dragon 
  12. 12 * 
  13. 13 */  
  14. 14public class CompareInterceptor implements MethodInterceptor{  
  15. 15  
  16. 16      public Object invoke(MethodInvocation invocation) throws Throwable{  
  17. 17          Object result = null;  
  18. 18         String stu_name = invocation.getArguments()[0].toString();  
  19. 19         if ( stu_name.equals("dragon")){  
  20. 20             //如果学生是dragon时,执行目标方法,  
  21. 21              result= invocation.proceed();  
  22. 22                
  23. 23         } else{  
  24. 24             System.out.println("此学生是"+stu_name+"而不是dragon,不批准其加入.");  
  25. 25         }  
  26. 26          
  27. 27          return result;  
  28. 28      }  
  29. 29}  

 

配置文件applicationContext.xml

Java代码  收藏代码
  1. 1<?xml version="1.0" encoding="UTF-8"?>  
  2.  2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.  3  
  4.  4<beans>  
  5.  5  
  6.  6<bean id="beforeAdvice" class="com.dragon.Advice.BeforeAdvice"></bean>  
  7.  7<bean id="afterAdvice" class="com.dragon.Advice.AfterAdvice"></bean>  
  8.  8<bean id="compareInterceptor" class="com.dragon.Advice.CompareInterceptor"></bean>  
  9.  9<bean id="studenttarget" class="com.dragon.study.Impl.StudentImpl"></bean>  
  10. 10  
  11. 11<bean id="student" class="org.springframework.aop.framework.ProxyFactoryBean">  
  12. 12  <property name="proxyInterfaces">  
  13. 13    <value>com.dragon.study.IStudent</value>  
  14. 14  </property>  
  15. 15  <property name="interceptorNames">  
  16. 16    <list>  
  17. 17     <value>beforeAdvice</value>  
  18. 18     <value>afterAdvice</value>  
  19. 19    <value>compareInterceptor</value>    
  20. 20    </list>  
  21. 21  </property>  
  22. 22  <property name="target">  
  23. 23    <ref bean="studenttarget"/>  
  24. 24  </property>  
  25. 25  
  26. 26</bean>  
  27. 27  
  28. 28</beans>  

 

现在开始写测试类,Test.java

Java代码  收藏代码
  1. 1/** 
  2.  2 *  
  3.  3 */  
  4.  4package com;  
  5.  5  
  6.  6import org.springframework.context.ApplicationContext;  
  7.  7import org.springframework.context.support.FileSystemXmlApplicationContext;  
  8.  8  
  9.  9import com.dragon.study.IStudent;  
  10. 10  
  11. 11/** 
  12. 12 * @author dragon 
  13. 13 * 
  14. 14 */  
  15. 15public class Test {  
  16. 16  
  17. 17    /** 
  18. 18     * @param args 
  19. 19     */  
  20. 20    public static void main(String[] args) {  
  21. 21        // TODO Auto-generated method stub  
  22. 22      ApplicationContext ctx =   
  23. 23          new FileSystemXmlApplicationContext("/com/dragon/applicationContext.xml");  
  24. 24        
  25. 25      IStudent person = (IStudent)ctx.getBean("student");  
  26. 26      person.addStudent("dragon");  
  27. 27        
  28. 28//      person.addStudent("javadragon");  
  29. 29    }  
  30. 30  
  31. 31}  
  32. 32  

 

当然,运行该程序时,要加上commons-logging.jar 包

 

在Spring Appactiocontext.xml配置文件;你定义的前置,后置;环绕等通知在配置文件中实现了代理(org.springframework.aop.framework.ProxyFactoryBean) 
以此将通知放入到了原Bean中;这样才能使原Bean中方法调用时自动执行通知 
这是其一》 
<property name="proxyInterfaces"> 
<property name="interceptorNames"> 
<property name="target"> 
这三个属性是一定要配置的 
第一是被代理的接口(IStudent) 
第二是通知列表(前置,后置;环绕)上面定义的三个类 
第三是被代理的原Bean(StudentImpl )

【上篇】
【下篇】

抱歉!评论已关闭.