• SSH框架系列:Spring AOP应用记录日志Demo


     

     

    分类: 【java】
    1.简介
    Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。以下是Spring AOP的小例子
    2.例子简介
    2.1切面aspect:Logging.java
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * $filename: Logging.java,v $ 
    3.  * $Date: 2013-12-10  $ 
    4.  * Copyright (C) ZhengHaibo, Inc. All rights reserved. 
    5.  * This software is Made by Zhenghaibo. 
    6.  */  
    7. package edu.njupt.zhb;  
    8. /* 
    9.  *@author: ZhengHaibo   
    10.  *web:     http://blog.csdn.net/nuptboyzhb 
    11.  *mail:    zhb931706659@126.com 
    12.  *2013-12-10  Nanjing,njupt,China 
    13.  */  
    14. public class Logging {  
    15.       
    16.     public void beforeAdvice(){  
    17.         System.out.println("Logging:before... ");  
    18.     }  
    19.       
    20.     public void afterAdvice(){  
    21.         System.out.println("Logging:after... ");  
    22.     }  
    23.     /** 
    24.      *  
    25.      * @param retVal 函数的返回值 
    26.      */  
    27.     public void afterReturningAdvice(Object retVal){  
    28.         if(retVal==null){  
    29.             return;  
    30.         }  
    31.         System.out.println("Logging:return :"+retVal.toString());  
    32.     }  
    33.       
    34.     public void afterThrowingAdvice(IllegalArgumentException ex){  
    35.         System.out.println("Logging:exception:"+ex.toString());  
    36.     }  
    37. }  


    2.2Bean: Student.java
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * $filename: Student.java,v $ 
    3.  * $Date: 2013-12-10  $ 
    4.  * Copyright (C) ZhengHaibo, Inc. All rights reserved. 
    5.  * This software is Made by Zhenghaibo. 
    6.  */  
    7. package edu.njupt.zhb;  
    8. /* 
    9.  *@author: ZhengHaibo   
    10.  *web:     http://blog.csdn.net/nuptboyzhb 
    11.  *mail:    zhb931706659@126.com 
    12.  *2013-12-10  Nanjing,njupt,China 
    13.  */  
    14. public class Student {  
    15.     private String id;  
    16.     private String name;  
    17.     public String getId() {  
    18.         return id;  
    19.     }  
    20.     public void setId(String id) {  
    21.         this.id = id;  
    22.     }  
    23.     public String getName() {  
    24.         return name;  
    25.     }  
    26.     public void setName(String name) {  
    27.         this.name = name;  
    28.     }  
    29.     public void printThrowException(){  
    30.         System.out.println("Exception in Student.class...");  
    31.         throw new IllegalArgumentException("Exception from Student...");  
    32.     }  
    33.     public void print(String say){  
    34.         System.out.println("Say:"+say+",Name = "+name);  
    35.     }  
    36. }  


    2.3xml文件配置
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.     xmlns:p="http://www.springframework.org/schema/p"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    7.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    8.     http://www.springframework.org/schema/aop   
    9.     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    10.     <!-- 切面类 -->  
    11.     <bean id="myLogging" class="edu.njupt.zhb.Logging"></bean>  
    12.     <!-- AOP配置 -->  
    13.     <aop:config>  
    14.        <aop:aspect id="logStudent" ref="myLogging">  
    15.            <!-- pointcut配置 -->  
    16.            <aop:pointcut id="allMethod" expression="execution(* edu.njupt.zhb.*.*(..))"/>  
    17.              <aop:before pointcut-ref="allMethod" method="beforeAdvice"/>  
    18.              <aop:after  pointcut-ref="allMethod" method="afterAdvice"/>  
    19.              <aop:after-returning pointcut-ref="allMethod" returning="retVal" method="afterReturningAdvice"/>  
    20.              <aop:after-throwing pointcut-ref="allMethod" throwing="ex" method="afterThrowingAdvice"/>  
    21.        </aop:aspect>  
    22.     </aop:config>  
    23.     <bean id="student" class="edu.njupt.zhb.Student">  
    24.       <property name="id" value="1012010638"></property>  
    25.       <property name="name" value="Haibo Zheng"></property>  
    26.     </bean>  
    27. </beans>  


    2.4测试
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package edu.njupt.zhb;  
    2. /* 
    3.  * $filename: TestMain.java,v $ 
    4.  * $Date: 2013-12-10  $ 
    5.  * Copyright (C) ZhengHaibo, Inc. All rights reserved. 
    6.  * This software is Made by Zhenghaibo. 
    7.  */  
    8.   
    9.   
    10. import org.springframework.context.ApplicationContext;  
    11. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    12.   
    13.   
    14. /* 
    15.  *@author: ZhengHaibo   
    16.  *web:     http://blog.csdn.net/nuptboyzhb 
    17.  *mail:    zhb931706659@126.com 
    18.  *2013-12-10  Nanjing,njupt,China 
    19.  */  
    20. public class TestMain {  
    21.   
    22.     /** 
    23.      * @param args 
    24.      */  
    25.     public static void main(String[] args) {  
    26.         // TODO Auto-generated method stub  
    27.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
    28.         Student student = (Student)context.getBean("student");  
    29.         System.out.println("-------------");  
    30.         student.getId();  
    31.         System.out.println("-------------");  
    32.         student.getName();  
    33.         System.out.println("-------------");  
    34.         student.print("Hi,I am a student");  
    35.         System.out.println("-------------");  
    36.         try{  
    37.            student.printThrowException();  
    38.         }catch (Exception e) {  
    39.             // TODO: handle exception  
    40.             System.out.println(e.getMessage());  
    41.         }  
    42.           
    43.     }  
    44.   
    45. }  

    2.5运行结果:
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. 2013-12-10 18:32:54 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@145e044: display name [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]; startup date [Tue Dec 10 18:32:54 CST 2013]; root of context hierarchy  
    3. 2013-12-10 18:32:54 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]  
    5. 2013-12-10 18:32:54 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  
    6. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1f4cbee  
    7. 2013-12-10 18:32:54 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    8. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1f4cbee: defining beans [myLogging,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,allMethod,student]; root of factory hierarchy  
    9. -------------  
    10. Logging:before...   
    11. Logging:after...   
    12. Logging:return :1012010638  
    13. -------------  
    14. Logging:before...   
    15. Logging:after...   
    16. Logging:return :Haibo Zheng  
    17. -------------  
    18. Logging:before...   
    19. Say:Hi,I am a student,Name = Haibo Zheng  
    20. Logging:after...   
    21. -------------  
    22. Logging:before...   
    23. Exception in Student.class...  
    24. Logging:after...   
    25. Logging:exception:java.lang.IllegalArgumentException: Exception from Student...  
    26. Exception from Student...  

    上述的方法只是在执行函数前,加一些自己的逻辑。如果完成更加复杂的功能,我们可能需要知道函数的名称以及函数的参数及其值等等信息。此时,我们只需要修改Logging类即可,可以修改为如下:(主要是使用了Spring aop中的JointPoint)
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * $filename: Logging.java,v $ 
    3.  * $Date: 2013-12-10  $ 
    4.  * Copyright (C) ZhengHaibo, Inc. All rights reserved. 
    5.  * This software is Made by Zhenghaibo. 
    6.  */  
    7. package edu.njupt.zhb;  
    8.   
    9. import org.aspectj.lang.JoinPoint;  
    10.   
    11. /* 
    12.  *@author: ZhengHaibo   
    13.  *web:     http://blog.csdn.net/nuptboyzhb 
    14.  *mail:    zhb931706659@126.com 
    15.  *2013-12-10  Nanjing,njupt,China 
    16.  */  
    17. public class Logging {  
    18.       
    19.     public void beforeAdvice(JoinPoint jointPoint){  
    20.         Object methodArgs[] = jointPoint.getArgs();//获取切入点函数的参数  
    21.         for(Object arg:methodArgs){  
    22.             System.out.println("Logging:args type="+arg.getClass().getName());  
    23.             System.out.println("Logging:args value="+arg);  
    24.         }  
    25.         System.out.println("Logging:ClassName="+jointPoint.getTarget().getClass().getName());  
    26.         System.out.println("Logging:MethodName="+jointPoint.getSignature().getName());  
    27.         System.out.println("Logging:before... ");  
    28.     }  
    29.       
    30.     public void afterAdvice(){  
    31.         System.out.println("Logging:after... ");  
    32.     }  
    33.     /** 
    34.      *  
    35.      * @param retVal 函数的返回值 
    36.      */  
    37.     public void afterReturningAdvice(Object retVal){  
    38.         if(retVal==null){  
    39.             return;  
    40.         }  
    41.         System.out.println("Logging:return :"+retVal.toString());  
    42.     }  
    43.       
    44.     public void afterThrowingAdvice(IllegalArgumentException ex){  
    45.         System.out.println("Logging:exception:"+ex.toString());  
    46.     }  
    47. }  

    此时的运行结果为:
     
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. 2013-12-10 19:44:07 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
    2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@145e044: display name [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]; startup date [Tue Dec 10 19:44:07 CST 2013]; root of context hierarchy  
    3. 2013-12-10 19:44:07 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
    4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]  
    5. 2013-12-10 19:44:07 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  
    6. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]: org.springframework.beans.factory.support.DefaultListableBeanFactory@787d6a  
    7. 2013-12-10 19:44:07 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
    8. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@787d6a: defining beans [myLogging,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,allMethod,student]; root of factory hierarchy  
    9. -------------  
    10. Logging:ClassName=edu.njupt.zhb.Student  
    11. Logging:MethodName=getId  
    12. Logging:before...   
    13. Logging:after...   
    14. Logging:return :1012010638  
    15. -------------  
    16. Logging:ClassName=edu.njupt.zhb.Student  
    17. Logging:MethodName=getName  
    18. Logging:before...   
    19. Logging:after...   
    20. Logging:return :Haibo Zheng  
    21. -------------  
    22. Logging:args type=java.lang.String  
    23. Logging:args value=Hi,I am a student  
    24. Logging:args type=java.lang.Integer  
    25. Logging:args value=20  
    26. Logging:ClassName=edu.njupt.zhb.Student  
    27. Logging:MethodName=print  
    28. Logging:before...   
    29. Say:Hi,I am a student,Name = Haibo Zheng,age = 20  
    30. Logging:after...   
    31. -------------  
    32. Logging:ClassName=edu.njupt.zhb.Student  
    33. Logging:MethodName=printThrowException  
    34. Logging:before...   
    35. Exception in Student.class...  
    36. Logging:after...   
    37. Logging:exception:java.lang.IllegalArgumentException: Exception from Student...  
    38. Exception from Student...  

    未经允许,不得用于商业目的
  • 相关阅读:
    浅谈css中的盒模型(框模型)
    Linux 字符设备驱动及一些简单的Linux知识
    java实现person类 override(重写) comparable接口
    java之内部类
    mac下sublime text3 安装px转rem插件
    python pip安装扩展报错
    curl http_code 状态码
    sed 批量替换文件
    centos 7 开机优化shell
    一个tcp连接可以发多少http请求
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4168492.html
Copyright © 2020-2023  润新知