首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题。这个时候就马上打开CRT或者SSH连上服务器拿日子来分析。受网络的各种限制。于是我们就想为什么不能直接在管理后台查看报错的信息呢。于是日志管理就出现了。
         其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器。都可以,在此我重点介绍我的实现方式。
         Aop有的人说拦截不到Controller。有的人说想拦AnnotationMethodHandlerAdapter截到Controller必 须得拦截 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。
首先Aop可以拦截到Controller的,这个是毋容置疑的其次须拦截AnnotationMethodHandlerAdapter也不是必须的。最起码我没有验证成功过这个。我的Spring版本是4.0.3。
         Aop之所以有的人说拦截不到Controller是因为Controller被jdk代理了。我们只要把它交给cglib代理就可以了。
第一步定义两个注解:
- package com.annotation;    
-     
- import java.lang.annotation.*;    
-     
-     
- @Target({ElementType.PARAMETER, ElementType.METHOD})    
- @Retention(RetentionPolicy.RUNTIME)    
- @Documented    
- public  @interface SystemControllerLog {    
-     
-     String description()  default "";    
-     
-     
- }    
-     
- package com.annotation;    
-     
- import java.lang.annotation.*;    
-     
-     
- @Target({ElementType.PARAMETER, ElementType.METHOD})    
- @Retention(RetentionPolicy.RUNTIME)    
- @Documented    
- public  @interface SystemServiceLog {    
-     
-     String description()  default "";    
-     
-     
- }    
 
第二步创建一个切点类:
 第三步把Controller的代理权交给cglib
在实例化ApplicationContext的时候需要加上
 
Xml代码 
- <!-- 启动对@AspectJ注解的支持 -->  
- <aop:aspectj-autoproxy/>  
 
 在调用Controller的时候AOP发挥作用所以在SpringMVC的配置文件里加上
Xml代码 
- <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller->  
- <aop:aspectj-autoproxy proxy-target-class="true" />  
 
 第四步使用
 
Controller层的使用
Java代码
 
-    @RequestMapping(value = "/delete")    
-    
-    @SystemControllerLog(description = "删除用户")    
-     public String del(Criteria criteria, String id, Model model, HttpSession session) {    
-         try {    
-            User user = (User) session.getAttribute(WebConstants.CURRENT_USER);    
-             if ( null != user) {    
-                 if (user.getId().equals(id)) {    
-                    msg = "您不可以删除自己!";    
-                    criteria = userService.selectByCriteriaPagination(criteria);    
-                }  else {    
-                    
-                    criteria = userService.delete(id, criteria);    
-                    msg = "删除成功!";    
-                }    
-            }    
-        }  catch (Exception e) {    
-            msg = "删除失败!";    
-        }  finally {    
-            model.addAttribute("msg", msg);    
-            model.addAttribute("criteria", criteria);    
-        }    
-        
-         return "user/list";    
-    }    
 
 Service层的使用
 
-    
-    @SystemServiceLog(description = "查询用户")    
-     public Criteria<User> selectByCriteriaPagination(Criteria<User> criteria)    
-    {    
-        criteria.getList().get(0).getAccount();    
-        
-         long total=userMapper.countByCriteria(criteria);    
-        
-        criteria.setRowCount(total);    
-        criteria.setList(userMapper.selectByCriteriaPagination(criteria));    
-         return  criteria;    
-    }    
 
效果图
 
用户操作:

 异常

SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
原文:http://www.cnblogs.com/downey/p/4909859.html