`
阅读更多
转载亲的:http://luoyu-ds.iteye.com/blog/1845584 ,

前几天做项目时,在做系统日志这一块,都是在每个方法里手写代码来添加,觉得很繁琐,考虑到spring有aop的功能,便寻思着用AOP来做这个日志功能。

首先需要传入日志记录的具体操作名称,我们可以用java的注解功能来带入参数,代码如下:


Java代码  收藏代码

    /**
     * 类的方法描述注解
     * @author LuoYu
     */ 
    @Target(ElementType.METHOD) 
    @Retention(RetentionPolicy.RUNTIME) 
    @Documented 
    @Inherited 
    public @interface Log { 
     
        /** 要执行的操作类型比如:add操作 **/ 
        public String operationType() default ""; 
         
        /** 要执行的具体操作比如:【添加仓库】 **/ 
        public String operationName() default ""; 
         
    } 

注解类编写好之后,就要考虑spring我切面的问题目了,首先我们要创建一个切点,也就是需要插入的代码块,代码如下:
Java代码  收藏代码

    /**
     * 通过Spring AOP来添加系统日志
     * @author LuoYu
     */ 
    public class LogAspect extends BaseAction{ 
     
        private static final long serialVersionUID = -5063868902693772455L; 
     
        private Log logger = LogFactory.getLog(LogAspect.class); 
         
        @SuppressWarnings( { "rawtypes", "unchecked" } ) 
        public void doSystemLog(JoinPoint point) throws Throwable {   
            Object[] param = point.getArgs(); 
            Method method = null; 
            String methodName = point.getSignature().getName();   
            if (!(methodName.startsWith("set") || methodName.startsWith("get")||methodName.startsWith("query"))){ 
                Class targetClass = point.getTarget().getClass();   
                method = targetClass.getMethod(methodName, param[0].getClass()); 
                if (method != null) { 
                    boolean hasAnnotation = method.isAnnotationPresent(com.tlj.pcxt.common.logaop.Log.class);   
                    if (hasAnnotation) { 
                        com.tlj.pcxt.common.logaop.Log annotation = method.getAnnotation(com.tlj.pcxt.common.logaop.Log.class);   
                        String methodDescp = annotation.operationType()+annotation.operationName(); 
                        if (logger.isDebugEnabled()) {   
                            logger.debug("Action method:" + method.getName() + " Description:" + methodDescp);   
                        }   
                        User appUser=(User) this.getHttpServletRequest().getSession().getAttribute("user"); 
                        if(appUser!=null){   
                            try{   
                                com.tlj.pcxt.entity.admin.Log logInfo=new com.tlj.pcxt.entity.admin.Log();   
                                logInfo.setIp(this.getHttpServletRequest().getRemoteAddr()); 
                                logInfo.setSubmitUser(appUser); 
                                logInfo.setContent(annotation.operationType()+","+appUser.getUserName()+ 
                                        "执行【"+annotation.operationName()+"】操作,影响数据的ID集合为["+getID(param[0])+"]"); 
                                this.logService.save(logInfo);   
                            }catch(Exception ex){   
                                logger.error(ex.getMessage());   
                            }   
                        }   
                    }   
                }   
            }   
        } 
         
        /**
         * 通过java反射来从传入的参数object里取出我们需要记录的id,name等属性,
         * 此处我取出的是id
         *@author 罗宇
         *@date 2013-4-11
         *@param obj
         *@return
         *@return String
         */ 
        public String getID(Object obj){ 
            if(obj instanceof String){ 
                return obj.toString(); 
            } 
            PropertyDescriptor pd = null; 
            Method method = null; 
            String v = ""; 
            try{ 
                pd = new PropertyDescriptor("id", obj.getClass()); 
                method = pd.getReadMethod();   
                v = String.valueOf(method.invoke(obj));  
            }catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return v; 
        } 
    } 

切入代码编写好之后,需要在applicatioContext.xml里配置切入规则,也就是说要在哪些方法执行的时候来切入上面编写的代码:配置如 下:
Xml代码  收藏代码

    <aop:aspectj-autoproxy/> 
        <bean id="logAspect" class="com.tlj.pcxt.common.logaop.LogAspect"/>     
         <aop:config>   
            <aop:aspect ref="logAspect">   
                <aop:pointcut id="logPointCut" expression=" 
                       (execution(* com.tlj.pcxt.service.*.*Impl.add*(..))) 
                    or (execution(* com.tlj.pcxt.service.*.*Impl.update*(..))) 
                    or (execution(* com.tlj.pcxt.service.*.*Impl.delete*(..))) 
                "/>   
                <aop:after pointcut-ref="logPointCut" method="doSystemLog"/>   
            </aop:aspect>   
        </aop:config>  

在此我配置的时在方法执行之后插入代码块


Xml代码  收藏代码

    <aop:after pointcut-ref="logPointCut" method="doSystemLog"/> 



并且是在所有以add,update,delete开头的方法才执行,其余的方法将不再匹配。

调用方法如下,


Java代码  收藏代码

    @Log(operationType="add操作:",operationName="添加仓库房间") 
    public void addWareHouseRoom(WareHouseRoom wareHouseRoom) throws ServiceException { 
        try{ 
            this.getWareHouseRoomDao().save(wareHouseRoom); 
        }catch (Exception e) { 
            throw new ServiceException(e); 
        } 
    } 





是在方法头前添加上面自定义的@Log注解,传入相关日志信息

另外,在LogAspect的doSystemLog方法里的
Java代码  收藏代码

    Object[] param = point.getArgs(); 

就是取出所匹配方法传入的参数,我们记录日志所需要的相关参数就是从这个对象里取出来的,并且在该方法下面的代码会检查所匹配的方法是否有注解@log,如果没有,会直接跳出该方法,不做任何处理.
分享到:
评论

相关推荐

    Spring AOP 日志管理 实例

    Spring AOP 日志管理 实例LoggingThrowsAdvice.java

    SpringAOP日志管理

    采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo

    SpringBoot+AOP日志

    在本项目中,"SpringBoot+AOP日志"是一个基于Spring Boot框架的日志管理系统,它利用了Spring Boot的便利性和AOP(面向切面编程)技术来实现对应用程序日志的高效、统一处理。让我们深入探讨一下这个项目的核心知识...

    struts aop日志系统

    struts aop日志系统,struts aop日志系统

    swagger和spring Aop日志结合

    另一方面,Spring AOP(面向切面编程)则是Spring框架的一个核心特性,用于实现跨切面的关注点,如日志记录。本篇文章将深入探讨如何将Swagger与Spring AOP结合起来,以实现优雅的日志记录功能。 首先,让我们了解...

    spring aop日志拦截

    在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现日志拦截,特别是对于controller层的操作。AOP允许我们定义横切关注点,这些关注点可以是如日志记录、事务管理、权限检查等通用功能,它们在程序...

    spring aop 日志打印

    各种切面编写方式,简单方便的完成切点打印日志,和执行其他方法少时诵诗书所

    spring AOP日志框架

    总结来说,Spring AOP日志框架允许我们通过注解方式轻松地实现业务日志管理,提高代码的可读性和可维护性,同时减少了代码冗余。通过自定义切面和通知,我们可以灵活地控制日志记录的时机和内容,满足不同场景的需求...

    SpringBoot+AOP日志服务

    SpringBoot+AOP日志服务是将流行的Java框架Spring Boot与面向切面编程(AOP)技术结合,用于实现高效、灵活的日志管理。在Spring Boot项目中,AOP可以帮助我们以非侵入式的方式记录应用运行时的行为,尤其是对于业务...

    Spring AOP日志切面

    结合logback和切面对参数名和参数值,方法运行时间,方法返回值记录日志,pom中需要添加ogback和切面依赖。

    AOP日志处理

    本主题将深入探讨如何使用Spring AOP(面向切面编程)来实现日志处理,这是一种优雅且灵活的方式。 首先,让我们了解什么是Spring AOP。Spring AOP是Spring框架的一部分,它允许开发者在不修改源代码的情况下,对...

    spring+springmvc+mybatis(简单登录)+aop日志管理(学习参考)

    项目中的"springAopTest"可能包含了测试类,用于验证AOP日志管理功能是否正常工作。测试类通常会模拟不同的场景,比如成功登录、失败登录,以及异常处理,以确保日志记录按预期进行。 总的来说,这个项目为学习者...

    aop日志(个人工作)

    AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,主要目的是将日志、事务管理、安全控制等关注点从业务逻辑中分离出来,实现代码的解耦和模块化。在Java领域,Spring框架提供了强大的AOP支持,...

    spring aop 操作日志

    本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。

    Flex整合Spring实现aop日志管理

    本文将深入探讨如何使用Flex与Spring框架整合,实现AOP(面向切面编程)来达到日志管理的目标。AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...

    基于spring boot 2实现的各类小例子。有aop日志,发送邮件,模板导出excel,模板导出word.zip

    1. **AOP日志**:AOP(面向切面编程)是Spring框架的一个重要特性,允许我们在不修改业务代码的情况下,对程序进行横向关注点的插入,如日志记录、事务管理、性能监控等。在这个例子中,我们可能会看到如何定义一个...

    java文件上传,断点续传+aop操作日志

    "java文件上传,断点续传+aop操作日志"这个主题涵盖了几个关键知识点:文件上传、断点续传技术、AOP(面向切面编程)以及操作日志记录。 1. **文件上传**: 文件上传是指用户通过Web页面将本地文件传输到服务器的...

Global site tag (gtag.js) - Google Analytics