« ZBLOG利用dp.SyntaxHighlighter进行语法高亮(转)« »关于 spring aop 面向切面编程 如何来做一个强大的日志记录功能.原创 标签的说明 »
spring aop 面向切面编程 如何来做一个强大的日志记录功能.原创

这个东西怎么做:spring aop 面向切面编程 如何来做一个强大的日志记录功能模板;

昨天经理把这个任务交给我,让我为公司现在的项目加上一个详细的日志记录功能模板,对所有的操作,至少是增删改运作进行一个记录,其要记录操作者,以及执行的方法,IP,以及操作的方法的参数.

我以前做过类似的功能,不过是在filter里做的,通过filter来检查action请求,记录请求中的参数及action名字.但是今天公司这个是要求用spring aop来做,这样就可以在spring里对要进行的日志记录方法进行一个配置.而且这样也就可以无缝集成到现有的系统中去了.

不过,很郁闷的是,我还没用这样做过,或者类似的功能.

==========================

哈哈,很爽,居然让我做好了.

其实也很简单,使用AOP的@AspectJ来做就可以了,方法步骤如下:

第一:>>在spring的配置文件里增加以下配置

<!-- 支持 @AspectJ 标记-->
    <aop:aspectj-autoproxy />

如果发现插入后,eclipse提示这行有错误,那可能是你的spring配置有问题,你对照一下我的spring里的beans的头:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
    default-autowire="byName" default-lazy-init="true">

关于spring和AOP及@aspectj配置可以参考一下我收藏的以下文章

基于@AspectJ配置Spring AOP之一==>http://www.busfly.cn/csdn/post/700.html

Spring 2.0的新特性之@AspectJ==>http://www.busfly.cn/csdn/post/699.html

AspectJ如何实现AOP==>http://www.busfly.cn/csdn/post/698.html

Spring 2.0中的AOP实现-aspectj-Advice==>http://www.busfly.cn/csdn/post/693.html

第二:>>配置一下@AspectJ 的bean,这个Bean就是一个普通的java对象bean,按照普通的bean来配置就行了,我的这个处理切面的bean配置如下 (包含了第一步的配置):

<!-- 支持 @AspectJ 标记-->
    <aop:aspectj-autoproxy />
    <bean id="logAspect" class="com.hs.dolphin.sys.LogAspect">
        <!-- 配置要记录日志的对象及属性(要监控的方法的第一个参数)  格式: 对象类名(带路径全称).属性GET方法名 -->
        <property name="obj_method">
            <map>
                <entry key="default">
                    <map><!-- 默认值,如果没有指定对象就执行这个 -->
                        <entry key="getId"><!-- 属性的get方法名字 -->
                            <value>id</value><!-- 属性名字 -->
                        </entry>
                    </map>
                </entry>

                <entry key="com.hs.dolphin.domain.User">
                    <map>
                        <entry key="getId"><!-- 属性的get方法名字 -->
                            <value>id</value><!-- 属性名字 -->
                        </entry>
                        <entry key="getUserName"><!-- 属性的get方法名字 -->
                            <value>userName</value><!-- 属性名字 -->
                        </entry>
                    </map>
                </entry>
            </map>
        </property>
    </bean>

第三:>>在这个切点处理bean类里,在class定义的上一行加上切面定义标签,如下:

@Aspect
// 切面定义标签
public class LogAspect {
    private UserSession sessionValue; // 当前操作员基本信息
    private String userIpAddress; // 当前操作员IP地址

第四:>>定义切点及处理方法

@Pointcut("execution(* *.*.*.service..*.insert*(..)) || execution(* *.*.*.service..*.update*(..)) "
        + "|| execution(* *.*.*.service..*.remove*(..))"
        + "|| execution(* *.*.*.service..*.delete*(..))")
    public void insertPointcut() {
    }

可以在@Pointcut定义下面的这个函数里写上要处理的代码,也可以进行更多更多大的扩展,我的项目里就是做了扩展处理,在上面这个函数里没添加任何方法处理,而是在后面扩展,也就是所谓的Advice吧,请看下一步

第五:>>Advice扩展处理

  @AfterReturning("insertPointcut()")
    public void insertLogInfo(JoinPoint joinPoint)
        throws Exception{
          /*处理代码,略*/       
       }

=====================================

好了,完成了,是不是很容易.在第五步的这个方法里有一个参数,这个参数也许就是切面自己传进来的,所以你就这样写吧,JoinPoint 对象里可以获取切面切点的相关信息,如方法名,参数,类路径,类名等等,这样我们就可以来记录操作者进行的操作的详细信息,比如执行的方法名,其所在的对象类名,操作方法里带的所有参数信息,等,再加上自己另外获取一些信息,比如,当前操作时间,操作用户,还可以根据以上信息来定义操作类别等等

本文里源码下载,只是关键的一个spring配置文件和那个bean,其它的文件没上传上来.转载者请将附件上传到你的服务器上

springaop面向切面编程如何来做一个强大的日志记录功能.原创(src).rar

 


Tags: spring  反向控制  面向切面编程  POJO  依赖注入  aop  原创   |

原创文章如转载,请注明:转载自:巴士飞扬-技术BLOG : http://www.busfly.net/

本文链接地址:http://www.busfly.net/post/spring-aop-aspectj-advice-log.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:
  • 引用此留言  4.wrw  
  • 请问如何在什么地方set的UserSession和ipAddress呢?
    busfly 于 2009-7-7 9:58:00 回复
    这个是在某一个Action(比UserAction)里对这个Bean的IP属性Set进去的
  • [删除]2009-7-6 16:59:05 回复该留言
  • 引用此留言  1.thanks  
  • 不能下载哦~谢谢
    巴士飞扬 于 2008-7-3 22:47:22 回复
    哦,果然不能下载,原来是下载地址中的中文问题,我改一个地址
  • [删除]2008-7-3 14:20:58 回复该留言




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
网站分类
分类最近文章
最近发表
最新评论及回复
最近留言
热文排行
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(J2EE为主):3769186.