`
zhonghuayu121
  • 浏览: 4918 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用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方法一样)。
分享到:
评论

相关推荐

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

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

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志管理。 一、Spring AOP基础 AOP是Spring框架的核心组件之一,它允许程序员定义“切面”,这些切面...

    spring AOP 切面日志 分层打日志

    在这里,我们重点关注如何利用Spring AOP实现分层日志记录。 **一、Spring AOP基本概念** 1. **切面(Aspect)**: 切面是封装了横切关注点的模块,例如日志记录就是一个横切关注点,它横跨多个对象和类。 2. **通知...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    spring aop实现日志功能

    通过以上步骤,我们可以有效地利用Spring AOP实现日志功能,使日志管理更加规范且易于维护。在实际项目中,可以针对不同的业务场景定制不同的日志策略,确保在不影响核心业务代码的同时,提供详尽的运行时信息。 ...

    Spring Aop之AspectJ注解配置实现日志管理的方法

    Spring Aop之AspectJ注解配置实现日志管理的方法 Spring Aop是基于AspectJ实现的面向切面编程(AOP),它提供了一个灵活的方式来实现日志管理。通过使用AspectJ注解,可以轻松地实现日志记录、性能监控、安全检查...

    JAVA 中Spring aop 实现日志记载

    在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...

    spring AOP注解的应用1

    在Spring框架中,AOP(面向切面编程)是一...Spring AOP注解的应用使得切面编程更加简单直观,大大简化了对横切关注点的管理。在实际开发中,结合Spring提供的其他特性,如事务管理,可以构建出高效、健壮的后端系统。

    Spring AOP--日志管理

    本文将深入探讨如何在Spring AOP中实现日志管理,以便更好地监控和调试应用程序。 首先,让我们理解什么是Spring AOP。AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在提高代码的可复用性和...

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的...通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大的工具,优化我们的应用程序。

    spring aop实现日志分析管理

    通过以上方式,我们可以利用Spring AOP和元注解实现灵活的日志管理和分析,同时确保日志记录对系统性能的影响最小。这在大型Java应用中尤其重要,因为它提供了宝贵的运维数据,有助于问题排查和性能优化。

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。...利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护性。

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    spring aop jar 包

    这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...

    spring aop 注解例子

    在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP 中,我们可以通过注解来简化...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    ### Spring AOP 实现流程日志跟踪 #### 一、背景与目的 在现代软件开发过程中,为了确保系统的稳定性和可维护性,通常会引入非功能性的需求来增强应用程序的功能,比如日志记录、安全控制等。这些需求往往不是业务...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    spring aop 切面添加日志

    本项目旨在演示如何在Spring AOP中添加日志功能,以实现对应用程序执行过程的透明跟踪。通过使用Java 1.8,我们可以利用其新特性,如Lambda表达式,来简化代码。 首先,让我们理解Spring AOP的基本概念。AOP是面向...

Global site tag (gtag.js) - Google Analytics