标签:
首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题。这个时候就马上打开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