SpringMVC利用AOP实现自定义注解记录日志

SpringMVC利用AOP实现自定义注解记录日志

自定义注解,结合AOP实现日志功能

在做AOP日志的的时候,注意:

<aop:aspectj-autoproxy proxy-target-class="true"/>

如果将上面的话放在spring-context.xml/applicationContext.xml中,这里的aop设置将不会生效!!


源代码下载地址:https://git.oschina.net/paincupid/springmvc.git


代码以下

  1. package com.paincupid.springmvc.log;  
  2.   
  3. import java.lang.annotation.Documented;    
  4. import java.lang.annotation.ElementType;    
  5. import java.lang.annotation.Retention;    
  6. import java.lang.annotation.RetentionPolicy;    
  7. import java.lang.annotation.Target;    
  8.     
  9. @Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取    
  10. @Target(ElementType.METHOD)//目标是方法    
  11. @Documented//文档生成时,该注解将被包含在javadoc中,可去掉    
  12. public @interface OpLogger {    
  13.         
  14.     public String id() default "-1";    
  15.     public enum OpType{ ADD,UPDATE, DEL, SEARCH};  
  16.     OpType type() default OpType.SEARCH;  
  17. }   

  1. package com.paincupid.springmvc.log;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import org.aspectj.lang.JoinPoint;  
  5. import org.aspectj.lang.Signature;  
  6. import org.aspectj.lang.annotation.AfterReturning;  
  7. import org.aspectj.lang.annotation.AfterThrowing;  
  8. import org.aspectj.lang.annotation.Aspect;  
  9. import org.aspectj.lang.annotation.Before;  
  10. import org.aspectj.lang.annotation.Pointcut;  
  11. import org.aspectj.lang.reflect.MethodSignature;  
  12. import org.slf4j.Logger;  
  13. import org.slf4j.LoggerFactory;  
  14. import org.springframework.stereotype.Component;  
  15. import com.paincupid.springmvc.log.OpLogger.OpType;  
  16.   
  17. /** 
  18.  *  
  19.  * @author arthur.paincupid.lee 
  20.  * @since 2016.01.18 
  21.  */  
  22. @Aspect  
  23. @Component  
  24. public class SysLogAspect {  
  25.     private  static  final Logger logger = LoggerFactory.getLogger(SysLogAspect. class);  
  26.       
  27.     @Pointcut("@annotation(com.paincupid.springmvc.log.OpLogger)")  
  28.     public void controllerAspect() {  
  29.     }  
  30.   
  31.     @Before("controllerAspect()")  
  32.     public void doBefore(JoinPoint joinPoint) {  
  33.         System.out.println("=====SysLogAspect前置通知开始=====");  
  34.         handleLog(joinPoint, null);  
  35.     }  
  36.       
  37.     @AfterReturning(pointcut="controllerAspect()")  
  38.     public  void doAfter(JoinPoint joinPoint) {  
  39.         System.out.println("=====SysLogAspect后置通知开始=====");  
  40.         handleLog(joinPoint,null);  
  41.     }  
  42.       
  43.     @AfterThrowing(value="controllerAspect()",throwing="e")  
  44.     public void doAfter(JoinPoint joinPoint, Exception e) {  
  45.         System.out.println("=====SysLogAspect异常通知开始=====");  
  46.         handleLog(joinPoint, e);  
  47.     }  
  48.   
  49.     private void handleLog(JoinPoint joinPoint,Exception e) {  
  50.         try {  
  51.             //获得注解  
  52.             OpLogger logger = giveController(joinPoint);  
  53.             if(logger == null)  
  54.             {  
  55.                 return;  
  56.             }  
  57.               
  58.             String signature = joinPoint.getSignature().toString(); // 获取目标方法签名  
  59.             String methodName = signature.substring(signature.lastIndexOf(".") + 1,  
  60.                     signature.indexOf("("));  
  61.   
  62.             String longTemp = joinPoint.getStaticPart().toLongString();  
  63.             String classType = joinPoint.getTarget().getClass().getName();  
  64.   
  65.             Class<?> clazz = Class.forName(classType);  
  66.   
  67.             Method[] methods = clazz.getDeclaredMethods();  
  68.             System.out.println("methodName: " + methodName);  
  69.   
  70.             for (Method method : methods) {  
  71.   
  72.                 if (method.isAnnotationPresent(OpLogger.class)  
  73.                         && method.getName().equals(methodName)) {  
  74.                     //OpLogger logger = method.getAnnotation(OpLogger.class);  
  75.                     String annId = logger.id();  
  76.                     OpType type = logger.type();  
  77.                     String clazzName = clazz.getName();  
  78.                     System.out.println("clazzName: " + clazzName+ ", methodName: "   
  79.                             + methodName + ", annId: "+ annId + ", type: "+type.toString());  
  80.                 }  
  81.             }  
  82.               
  83.         } catch (Exception exp) {  
  84.             logger.error("异常信息:{}", exp.getMessage());  
  85.             exp.printStackTrace();  
  86.            }  
  87.     }  
  88.   
  89.     private static OpLogger giveController(JoinPoint joinPoint) throws Exception {  
  90.         Signature signature = joinPoint.getSignature();  
  91.         MethodSignature methodSignature = (MethodSignature) signature;  
  92.         Method method = methodSignature.getMethod();  
  93.   
  94.         if (method != null) {  
  95.             return method.getAnnotation(OpLogger.class);  
  96.         }  
  97.         return null;  
  98.     }  
  99.       
  100.       
  101.     public void insertLogSuccess(JoinPoint jp, OpLogger logger) {}  
  102.   
  103.     public void writeLogInfo(JoinPoint joinPoint, OpLogger opLogger)  
  104.             throws Exception, IllegalAccessException {}  
  105. }  

  1. <!-- 最重要:::如果放在spring-context.xml中,这里的aop设置将不会生效 -->  
  2.     <aop:aspectj-autoproxy proxy-target-class="true" />  

别忘记引入:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  3.     xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns="http://www.springframework.org/schema/mvc"  
  5.     xsi:schemaLocation="  
  6.                  http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
  7.                  http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.                  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
  9.                  http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc.xsd  
  10.              "  
  11.     default-autowire="byName">  

使用:

  1. package com.paincupid.springmvc.json.controller;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4. import java.util.List;  
  5.   
  6. import org.apache.ibatis.builder.ParameterExpression;  
  7. import org.aspectj.lang.JoinPoint;  
  8. import org.slf4j.Logger;  
  9. import org.slf4j.LoggerFactory;  
  10. import org.springframework.stereotype.Controller;  
  11. import org.springframework.ui.Model;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.bind.annotation.RequestMethod;  
  14. import org.springframework.web.bind.annotation.RequestParam;  
  15. import org.springframework.web.bind.annotation.ResponseBody;  
  16.   
  17. import com.paincupid.springmvc.log.OpLogger;  
  18. import com.paincupid.springmvc.log.OpLogger.OpType;  
  19. import com.paincupid.springmvc.test.domain.Person;  
  20. import com.paincupid.springmvc.util.BaseJsonRst;  
  21. import com.paincupid.springmvc.util.CreatMockData;  
  22.   
  23. @Controller  
  24. @RequestMapping("/jqueryFormPluginSimple")  
  25. public class JqueryFormPluginSimpleController {  
  26.     private static final Logger log = LoggerFactory.getLogger(JqueryFormPluginSimpleController.class);  
  27.       
  28.     /** 
  29.      * 在前台的访问路径为: http://localhost:8080/springmvc/jqueryFormPluginSimple/list 
  30.      * @param person 
  31.      * @param model 
  32.      * @return 
  33.      */  
  34.     @RequestMapping("/list")  
  35.     @OpLogger(id = "18611112222", type=OpType.SEARCH)  
  36.     public String listPerson() {  
  37.           
  38.         return "json/jqueryFormPluginSimple";  
  39.     }  
  40.       
  41.     /** 
  42.      * 请求接收的是一个Java类 
  43.      * @param person 
  44.      * @return 
  45.      */  
  46.     @ResponseBody  
  47.     @OpLogger(id = "18633334444", type=OpType.SEARCH)  
  48.     @RequestMapping(value="/getForm", method=RequestMethod.POST)  
  49.     public BaseJsonRst<List<Person>> getForm(Person person, @RequestParam("currentPage"int currentPage){  
  50.         log.info("\r\nid: "+person.getId()+", name: "+person.getName()+", currentPage: "+currentPage);  
  51.         BaseJsonRst<List<Person>> ret =  new BaseJsonRst<List<Person>>();  
  52.         List<Person> list = CreatMockData.createPersonList(20,currentPage);  
  53.         ret.setResult(list);  
  54.         ret.setTotalCounts(250);  
  55.         ret.setCurrentPage(person.getCurrentPage());  
  56.         ret.setSuccess(true);  
  57.           
  58.         /** 
  59.          * 如果抛出异常,刚可以被日志捕获到,但如果是try catch的话,就不得调到public void doAfter(JoinPoint joinPoint, Exception e) 方法了 
  60.          */  
  61.         //throw Exception("error happen!");  
  62.           
  63.         return ret;  
  64.     }  
  65.       
  66.     private Exception Exception(String string) {  
  67.         // TODO Auto-generated method stub  
  68.         return null;  
  69.     }  
  70.   
  71.     public static void main(String[] args){  
  72.         int a = (int)Math.ceil(1.002);  
  73.         System.out.println(a);  
  74.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值