转载亲的: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 日志管理 实例LoggingThrowsAdvice.java
采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo
在本项目中,"SpringBoot+AOP日志"是一个基于Spring Boot框架的日志管理系统,它利用了Spring Boot的便利性和AOP(面向切面编程)技术来实现对应用程序日志的高效、统一处理。让我们深入探讨一下这个项目的核心知识...
struts aop日志系统,struts aop日志系统
另一方面,Spring AOP(面向切面编程)则是Spring框架的一个核心特性,用于实现跨切面的关注点,如日志记录。本篇文章将深入探讨如何将Swagger与Spring AOP结合起来,以实现优雅的日志记录功能。 首先,让我们了解...
在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现日志拦截,特别是对于controller层的操作。AOP允许我们定义横切关注点,这些关注点可以是如日志记录、事务管理、权限检查等通用功能,它们在程序...
各种切面编写方式,简单方便的完成切点打印日志,和执行其他方法少时诵诗书所
总结来说,Spring AOP日志框架允许我们通过注解方式轻松地实现业务日志管理,提高代码的可读性和可维护性,同时减少了代码冗余。通过自定义切面和通知,我们可以灵活地控制日志记录的时机和内容,满足不同场景的需求...
SpringBoot+AOP日志服务是将流行的Java框架Spring Boot与面向切面编程(AOP)技术结合,用于实现高效、灵活的日志管理。在Spring Boot项目中,AOP可以帮助我们以非侵入式的方式记录应用运行时的行为,尤其是对于业务...
结合logback和切面对参数名和参数值,方法运行时间,方法返回值记录日志,pom中需要添加ogback和切面依赖。
本主题将深入探讨如何使用Spring AOP(面向切面编程)来实现日志处理,这是一种优雅且灵活的方式。 首先,让我们了解什么是Spring AOP。Spring AOP是Spring框架的一部分,它允许开发者在不修改源代码的情况下,对...
项目中的"springAopTest"可能包含了测试类,用于验证AOP日志管理功能是否正常工作。测试类通常会模拟不同的场景,比如成功登录、失败登录,以及异常处理,以确保日志记录按预期进行。 总的来说,这个项目为学习者...
AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,主要目的是将日志、事务管理、安全控制等关注点从业务逻辑中分离出来,实现代码的解耦和模块化。在Java领域,Spring框架提供了强大的AOP支持,...
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
本文将深入探讨如何使用Flex与Spring框架整合,实现AOP(面向切面编程)来达到日志管理的目标。AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解...
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
1. **AOP日志**:AOP(面向切面编程)是Spring框架的一个重要特性,允许我们在不修改业务代码的情况下,对程序进行横向关注点的插入,如日志记录、事务管理、性能监控等。在这个例子中,我们可能会看到如何定义一个...
"java文件上传,断点续传+aop操作日志"这个主题涵盖了几个关键知识点:文件上传、断点续传技术、AOP(面向切面编程)以及操作日志记录。 1. **文件上传**: 文件上传是指用户通过Web页面将本地文件传输到服务器的...