`
stevenzuo
  • 浏览: 12527 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多
http://blog.csdn.net/paincupid/article/details/50534412

自定义注解,结合AOP实现日志功能
在做AOP日志的的时候,注意:
<aop:aspectj-autoproxy proxy-target-class="true"/>
如果将上面的话放在spring-context.xml/applicationContext.xml中,这里的aop设置将不会生效!!

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

代码以下
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.log; 
 
import java.lang.annotation.Documented;   
import java.lang.annotation.ElementType;   
import java.lang.annotation.Retention;   
import java.lang.annotation.RetentionPolicy;   
import java.lang.annotation.Target;   
   
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取   
@Target(ElementType.METHOD)//目标是方法   
@Documented//文档生成时,该注解将被包含在javadoc中,可去掉   
public @interface OpLogger {   
       
    public String id() default "-1";   
    public enum OpType{ ADD,UPDATE, DEL, SEARCH}; 
    OpType type() default OpType.SEARCH; 
}  

[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.log; 
 
import java.lang.reflect.Method; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.Signature; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 
import org.aspectj.lang.reflect.MethodSignature; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 
import com.paincupid.springmvc.log.OpLogger.OpType; 
 
/**

* @author arthur.paincupid.lee
* @since 2016.01.18
*/ 
@Aspect 
@Component 
public class SysLogAspect { 
    private  static  final Logger logger = LoggerFactory.getLogger(SysLogAspect. class); 
     
    @Pointcut("@annotation(com.paincupid.springmvc.log.OpLogger)") 
    public void controllerAspect() { 
    } 
 
    @Before("controllerAspect()") 
    public void doBefore(JoinPoint joinPoint) { 
        System.out.println("=====SysLogAspect前置通知开始====="); 
        handleLog(joinPoint, null); 
    } 
     
    @AfterReturning(pointcut="controllerAspect()") 
    public  void doAfter(JoinPoint joinPoint) { 
        System.out.println("=====SysLogAspect后置通知开始====="); 
        handleLog(joinPoint,null); 
    } 
     
    @AfterThrowing(value="controllerAspect()",throwing="e") 
    public void doAfter(JoinPoint joinPoint, Exception e) { 
        System.out.println("=====SysLogAspect异常通知开始====="); 
        handleLog(joinPoint, e); 
    } 
 
    private void handleLog(JoinPoint joinPoint,Exception e) { 
        try { 
            //获得注解 
            OpLogger logger = giveController(joinPoint); 
            if(logger == null) 
            { 
                return; 
            } 
             
            String signature = joinPoint.getSignature().toString(); // 获取目标方法签名 
            String methodName = signature.substring(signature.lastIndexOf(".") + 1, 
                    signature.indexOf("(")); 
 
            String longTemp = joinPoint.getStaticPart().toLongString(); 
            String classType = joinPoint.getTarget().getClass().getName(); 
 
            Class<?> clazz = Class.forName(classType); 
 
            Method[] methods = clazz.getDeclaredMethods(); 
            System.out.println("methodName: " + methodName); 
 
            for (Method method : methods) { 
 
                if (method.isAnnotationPresent(OpLogger.class) 
                        && method.getName().equals(methodName)) { 
                    //OpLogger logger = method.getAnnotation(OpLogger.class); 
                    String annId = logger.id(); 
                    OpType type = logger.type(); 
                    String clazzName = clazz.getName(); 
                    System.out.println("clazzName: " + clazzName+ ", methodName: "  
                            + methodName + ", annId: "+ annId + ", type: "+type.toString()); 
                } 
            } 
             
        } catch (Exception exp) { 
            logger.error("异常信息:{}", exp.getMessage()); 
            exp.printStackTrace(); 
           } 
    } 
 
    private static OpLogger giveController(JoinPoint joinPoint) throws Exception { 
        Signature signature = joinPoint.getSignature(); 
        MethodSignature methodSignature = (MethodSignature) signature; 
        Method method = methodSignature.getMethod(); 
 
        if (method != null) { 
            return method.getAnnotation(OpLogger.class); 
        } 
        return null; 
    } 
     
     
    public void insertLogSuccess(JoinPoint jp, OpLogger logger) {} 
 
    public void writeLogInfo(JoinPoint joinPoint, OpLogger opLogger) 
            throws Exception, IllegalAccessException {} 


[html] view plain copy 在CODE上查看代码片派生到我的代码片
<!-- 最重要:::如果放在spring-context.xml中,这里的aop设置将不会生效 --> 
    <aop:aspectj-autoproxy proxy-target-class="true" /> 
别忘记引入:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
                 http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
                 http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd 
                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
                 http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc.xsd 
             " 
    default-autowire="byName"> 

使用:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.json.controller; 
 
import java.io.UnsupportedEncodingException; 
import java.util.List; 
 
import org.apache.ibatis.builder.ParameterExpression; 
import org.aspectj.lang.JoinPoint; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.ResponseBody; 
 
import com.paincupid.springmvc.log.OpLogger; 
import com.paincupid.springmvc.log.OpLogger.OpType; 
import com.paincupid.springmvc.test.domain.Person; 
import com.paincupid.springmvc.util.BaseJsonRst; 
import com.paincupid.springmvc.util.CreatMockData; 
 
@Controller 
@RequestMapping("/jqueryFormPluginSimple") 
public class JqueryFormPluginSimpleController { 
    private static final Logger log = LoggerFactory.getLogger(JqueryFormPluginSimpleController.class); 
     
    /**
     * 在前台的访问路径为: http://localhost:8080/springmvc/jqueryFormPluginSimple/list
     * @param person
     * @param model
     * @return
     */ 
    @RequestMapping("/list") 
    @OpLogger(id = "18611112222", type=OpType.SEARCH) 
    public String listPerson() { 
         
        return "json/jqueryFormPluginSimple"; 
    } 
     
    /**
     * 请求接收的是一个Java类
     * @param person
     * @return
     */ 
    @ResponseBody 
    @OpLogger(id = "18633334444", type=OpType.SEARCH) 
    @RequestMapping(value="/getForm", method=RequestMethod.POST) 
    public BaseJsonRst<List<Person>> getForm(Person person, @RequestParam("currentPage") int currentPage){ 
        log.info("\r\nid: "+person.getId()+", name: "+person.getName()+", currentPage: "+currentPage); 
        BaseJsonRst<List<Person>> ret =  new BaseJsonRst<List<Person>>(); 
        List<Person> list = CreatMockData.createPersonList(20,currentPage); 
        ret.setResult(list); 
        ret.setTotalCounts(250); 
        ret.setCurrentPage(person.getCurrentPage()); 
        ret.setSuccess(true); 
         
        /**
         * 如果抛出异常,刚可以被日志捕获到,但如果是try catch的话,就不得调到public void doAfter(JoinPoint joinPoint, Exception e) 方法了
         */ 
        //throw Exception("error happen!"); 
         
        return ret; 
    } 
     
    private Exception Exception(String string) { 
        // TODO Auto-generated method stub 
        return null; 
    } 
 
    public static void main(String[] args){ 
        int a = (int)Math.ceil(1.002); 
        System.out.println(a); 
    } 
分享到:
评论

相关推荐

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...

    springMVC AOP拦截拦截Controller等实现日志管理

    在这个场景中,我们将讨论如何利用AOP来实现Controller的日志管理,以捕获并记录应用程序中的异常。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面是关注点的模块化,如日志记录。切...

    springMVC自定义注解,用AOP来实现日志记录的方法

    SpringMVC自定义注解与AOP实现日志记录的方法 在本文中,我们将探讨如何使用SpringMVC自定义注解与AOP(Aspect-Oriented Programming)来实现日志记录的方法。该方法可以在项目中记录业务操作的日志,并提取关键...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`Jackson`的日志脱敏实现源码,提供了多种实现方式,旨在帮助开发者在保障信息安全的同时,充分利用日志进行系统分析。 1. **基于正则表达式的日志脱敏实现...

    简单的SpringMVC加注解AOP,改变传进的值

    接下来,我们讨论"AOP和自定义注解"。AOP的核心思想是将那些分散在多个类中的横切关注点(如日志、事务管理、安全检查等)抽取出来,形成独立的模块,这样可以降低代码的耦合度,提高可维护性。在Spring中,我们可以...

    SpringMVC-Aop demo

    这个项目旨在帮助开发者理解如何通过注解来配置和实现AOP,以便进行日志记录、事务管理或其他跨功能的需求。下面我们将详细探讨SpringMVC与AOP的结合以及其核心概念。 AOP是一种编程范式,允许我们定义关注点(如...

    Spring MVC AOP通过注解方式拦截Controller等实现日志管理demo版本2

    本项目"Spring MVC AOP通过注解方式拦截Controller等实现日志管理demo版本2"是基于注解的AOP实践,旨在帮助开发者了解如何利用AOP来记录应用程序中的关键操作日志。以下是关于这个主题的详细解释: 1. **Spring AOP...

    使用使用切面的方式记录日志springMvc + hibernate

    在代码实现上,我们需要创建自定义的切面类,继承自Spring的AspectJExpressionPointcutAdvisor或实现MethodBeforeAdvice接口,然后在Controller方法中使用@Autowired注解注入需要记录日志的服务。 总结来说,本项目...

    自定义的springMVC

    - **拦截器(Interceptor)**:自定义拦截器可以实现全局的功能,比如权限验证、日志记录、性能统计等。通过实现HandlerInterceptor接口并将其注册到SpringMVC配置中,即可在请求处理前后执行自定义逻辑。 - **...

    SpringMVC+Hibernate实现增删改

    5. **Interceptor**: 拦截器允许在请求处理前后进行预处理和后处理,例如权限验证、日志记录等。 6. **ModelAndView**: 用于将模型数据和视图名称一起返回给DispatcherServlet。 **Hibernate框架** Hibernate是一个...

    java分页 动态代理 aop实现

    AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查等)从主业务逻辑中分离出来,实现代码的解耦。Spring AOP主要通过两种方式实现: 1. 声明式AOP:基于注解的AOP,通过在方法上添加...

    springboot学习、springmvc、mybatis、注解、拦截器.zip

    注解的学习主要在于理解不同注解的作用,例如@Controller、@Service、@Autowired等,并掌握如何自定义注解和使用元注解。 最后,学习拦截器,你需要知道如何注册拦截器,实现拦截器的preHandle、postHandle和...

    spring_aop_拦截实例

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、性能监控等,并将它们模块化为可重用的组件,称为切面。本实例主要探讨如何在Spring AOP中实现拦截器。 ...

    SpringMVC面试专题及答案.zip

    9. **AOP(面向切面编程)**:SpringMVC与Spring AOP紧密集成,可以方便地实现事务管理、日志记录等功能,提高代码的可维护性和可复用性。 10. **RESTful风格**:SpringMVC支持创建RESTful API,通过@...

    SpringMVC完整使用教程

    SpringMVC 可以结合 Spring 的 AOP(面向切面编程)来实现全局行为,如日志记录、权限控制等。另外,`HandlerInterceptor` 实现类可以自定义拦截器,对请求处理流程进行扩展。 综上所述,SpringMVC 提供了一个强大...

    springmvc框架源码.zip

    8. **AOP(面向切面编程)**:SpringMVC利用Spring的AOP功能实现拦截器(Interceptor),可以在请求处理前后执行自定义逻辑,如日志记录、权限检查等。 9. **异常处理**:SpringMVC提供了一套优雅的异常处理机制,...

    Spring 与Ehcache实现基于方法的缓存

    本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...

    SpringMVC jar包

    8. **AOP(面向切面编程)**:SpringMVC利用AOP进行事务管理和日志记录等,使得这些跨切面的职责可以与核心业务逻辑分离。 9. **IoC(控制反转)**:SpringMVC使用IoC容器管理对象及其依赖关系,允许在运行时注入...

Global site tag (gtag.js) - Google Analytics