zoukankan      html  css  js  c++  java
  • 利用spring AOP注解实现日志管理

    最近刚接手一个项目,在项目的开始阶段,我们的架构师分配了个任务给我,让我利用spring的切面技术做一个日志管理的案例。要求很简单,就是需要记录:谁在什么时候对谁做了什么操作,同时在日志的描述中还要有修改前后内容的对比。话说两句话是挺简单的,但是对于对spring只有初学者水平的我还是有点难度的,于是各种百度,各种谷歌,各种想。终于在这篇http://kaowww153.iteye.com/blog/603891博客中得到启发,但是里面的内容写的还是不够完整,和我的需求也有些不一样。经过多次的修改和测试,终于成功通过。今天闲来无事,写个博文,以备下次需要做好笔记。话不多说,把过程写下: 
      1.首先创建一个自定义注解 
    package com.cstp.custom.interfaces; 

    import java.lang.annotation.ElementType; 
    import java.lang.annotation.Retention; 
    import java.lang.annotation.RetentionPolicy; 
    import java.lang.annotation.Target; 

    @Target({ElementType.METHOD})  
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface RecordLog { 


      2.写一个过滤方法,这个方法是实现MethodIntherceptor接口的。 
    package com.cstp.custom.interfaces; 

    import java.lang.reflect.Method; 

    import javax.servlet.http.HttpServletRequest; 

    import org.aopalliance.intercept.MethodInterceptor; 
    import org.aopalliance.intercept.MethodInvocation; 

    import com.cstp.jdbc.dao.systemLogDao; 
    import com.cstp.jdbc.dao.impl.systemLogDaoImpl; 
    import com.cstp.jdbc.vo.SystemLog; 
    import com.cstp.jdbc.vo.User; 

    public class LogAroundInterceptor implements MethodInterceptor { 
    private systemLogDao systemLogDao = new systemLogDaoImpl(); 

    @Override 
    public Object invoke(MethodInvocation invocation) throws Throwable { 
    // TODO Auto-generated method stub 
    Object returnObject; 
    Object newObj = null; 
    Object operatObj = null; 
    HttpServletRequest request = null; 
    Method method = invocation.getMethod(); 
    if (method.isAnnotationPresent(RecordLog.class)) { 
    Object[] arguments = invocation.getArguments(); 

    if (null != arguments) { 
    newObj = arguments[0];//新对象 
    operatObj = arguments[1];//操作人 
    if (arguments[2] instanceof HttpServletRequest) { 
    request = (HttpServletRequest)arguments[2]; //通过session把旧对象传过来作为新旧对象的比较 

    SystemLog systemLog = getSysLog(getOperaType(method.getName()), newObj, operatObj, request); 
    System.out.println(systemLog); 
    systemLogDao.addLog(systemLog); 

    returnObject = invocation.proceed(); // 执行被拦截的方法 
    } else { 
    returnObject = invocation.proceed(); // 执行被拦截的方法 

    return returnObject; 


    public int getOperaType(String methodName) { 
    int type = 0; 
    if (methodName.startsWith("save") || methodName.startsWith("add") || methodName.startsWith("insert")) { 
    type = 1;//增 
    } else if (methodName.startsWith("delete") || methodName.startsWith("del")) { 
    type = 2;//删 
    } else if (methodName.startsWith("update")){ 
    type = 3;//改 

    return type; 


    public SystemLog getSysLog(int type, Object newObj, Object operator,HttpServletRequest request) { 
    StringBuffer sysContent = new StringBuffer(); 
    SystemLog systemLog = new SystemLog(); 
    Object oldObject = request.getSession().getAttribute("oldUser"); 
    if (type != 1 && type != 2 && type != 3) { 
    System.out.println("此方法不能被记录日志"); 
    return null; 

    if (newObj instanceof User) { 
    User user = (User) newObj; 
    sysContent.append("用户:"); 
    if (type == 1) { 
    sysContent.append(user.getName()).append("被保存."); 
    } else if (type == 2) { 
    // sysContent.append(user.getDeleteUser()).append( 
    // "删除了用户:" + user.getUniqueUserName()); 


    return systemLog; 




    3.applicationContext.xml里配置 
    <bean id="common" class="com.cstp.jdbc.test.Common"> 
    </bean> 

    <aop:config> 
    <aop:pointcut id="logPointCuts" 
    expression="execution(* com.cstp.jdbc.test.*.*(..))" /> 
    <aop:advisor pointcut-ref="logPointCuts" advice-ref="springMethodInterceptor" /> 
    </aop:config> 

    <bean id="springMethodInterceptor" class="com.cstp.custom.interfaces.LogAroundInterceptor"> 
    </bean> 
    </beans> 
    4.我的实体类common 
    @RecordLog 
    public void update(User user, User opeartor, HttpServletRequest request) { 

    UserDao userDao = new UserDaoImpl(); 
    userDao.updateUser(user); 
    System.out.println("修改成功"); 


    5.在servlet测试 
    UserDao userDao = new UserDaoImpl(); 
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    Common c = (Common) factory.getBean("common"); 
    User user = new User(); 
    user.setId(2); 
    user.setName("杰"); 
    user.setPassword("123456"); 
    user.setAge(18); 
    user.setSex("女"); 
    User opeartor = userDao.findAllUserById(3); 

    User oldUser = userDao.findAllUserById(2); 
    HttpSession session = request.getSession(); 
    session.setAttribute("oldUser", oldUser); 

    c.update(user, opeartor, request); 
    测试通过,我所需要的新旧对象,以及操作人,时间,描述等都可以在getSysLog()方法中获取,至于如何添加就简单啦,就不写上了。 
    6.使用方法很简单了:在需要添加日志的方法上加上我们的注解@RecordLog就可以了(就像我common类里的update方法一样)。
  • 相关阅读:
    Multidimensional Arrays
    TortoiseGit
    Excel教程(14)
    Excel教程(13)
    Excel教程(12)
    Excel教程(11)
    lock
    reflect
    game
    html x
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959708.html
Copyright © 2011-2022 走看看