当前位置: 首页 > 后端技术 > Java

Springboot是如何使用Aspect来实现切面日志的

时间:2023-04-02 00:04:08 Java

以系统日志为例首先我们来做一些准备工作。1.新建一个Springboot项目2.添加必要的依赖AOP必须org.springframework.bootspring-boot-starter-aopgson主要是我是用来做数据处理的,没必要com.google.code.gsongson2.8.1个人喜好org.springframework.bootspring-boot-devtools运行时org.projectlomboklomboktrue3.日志实体类和服务包com.space.aspect.bo;importlombok.Data;/**系统日志bo@作者zhuzhe*/@DatapublicclassSysLogBO{privateStringclassName;privateStringmethodName;privateStringparams;privateLongexeuTime;私有字符串备注;私有字符串createDate;}包com.space.aspect.service;导入com.space.aspect.bo.SysLogBO;导入lombok.extern.slf4j.Slf4j;导入org.springframework.stereotype.Service;/**@authorzhuzhe*/@Slf4j@ServicepublicclassSysLogService{publicbooleansave(SysLogBOsysLogBO){//这里不做具体实现log.info(sysLogBO.getParams());returntrue;}}4.这里定义日志注解,我们使用注解形式记录日志,所以先定义一个注解包com.space.aspect.anno;importjava.lang.annotation.*;/**定义系统logannotation@authorzhuzhe*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceSysLog{Stringvalue()default"";}5.声明切面,完成日志记录。以上4点我们的准备工作已经完成。重点是跟随java培训。这里需要对AOP有一定的了解。至少要知道切入点表达式,周围通知,前置通知,后置通知等等。.包com.space.aspect.aspect;导入com.google.gson.Gson;导入com.space.aspect.anno.SysLog;导入com.space.aspect.bo.SysLogBO;导入com.space.aspect.service.SysLogService;导入org.aspectj.lang.ProceedingJoinPoint;导入org.aspectj.lang.annotation.Around;导入org.aspectj.lang.annotation.Aspect;导入org.aspectj.lang.annotation.Pointcut;导入org.aspectj.lang。reflect.MethodSignature;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.stereotype.Component;导入java.lang.reflect.Method;导入java.text.SimpleDateFormat;导入java.util.ArrayList;导入java.util.Date;importjava.util.List;/**系统日志切面@authorzhuzhe*/@Aspect//使用@Aspect注解声明一个切面@ComponentpublicclassSysLogAspect{@AutowiredprivateSysLogServicesysLogService;/***这里我们使用注解的形式*当然我们也可以直接通过切入点表达式指定要拦截的包,要拦截的类和方法*切入点表达式:execution(...)*/@Pointcut(“@annotation(com.space.aspect.anno.SysLog)”)publicvoidlogPointCut(){}/***循环通知@Around,当然可以使用@Before(前通知)@After(后通知)*@parampoint*@return*@throwsThrowable*/@Around("logPointCut()")publicObjectaround(ProceedingJoinPointpoint)throwsThrowable{longbeginTime=System.currentTimeMillis();对象结果=point.proceed();长时间=System.currentTimeMillis()-beginTime;try{saveLog(点,时间);}catch(Exceptione){}returnresult;}/***保存日期*@paramjoinPoint*@paramtime*/privatevoidsaveLog(ProceedingJoinPointjoinPoint,longtime){MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();方法method=signature.getMethod();SysLogBOsysLogBO=newSysLogBO();sysLogBO.setExeuTime(时间);SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");(dateFormat.format(newDate()));SysLogsysLog=method.getAnnotation(SysLog.class);如果(系统日志!=空){sysLogBO.setRemark(sysLog.value());}//请求的类名和方法名StringclassName=joinPoint.getTarget().getClass().getName();StringmethodName=signature.getName();sysLogBO.setClassName(类名);sysLogBO.setMethodName(methodName);//请求的参数Object[]args=joinPoint.getArgs();try{Listlist=newArrayList();for(Objecto:args){list.add(newGson().toJson(o));}sysLogBO.setParams(list.toString());}catch(Exceptione){}sysLogService.save(sysLogBO);}}6.测试接下来我们测试一下packagecom.space.aspect.controller;importcom.space.aspect.anno.SysLog;importorg.springframework。web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/**@authorzhuzhe*/@RestControllerpublicclassTestController{@SysLog("test")@GetMapping("/test")publicStringtest(@RequestParam("name")Stringname){returnname;}}启动项目,访问我们的测试方法,可以看到我们在服务中打断点成功获取到了我们需要的所有值。这样,我们就有了成功实现了使用Aspectimplementsaspectlogging.转自Java笔记小虾