保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

我使用SpringAOP实现了用户操作日志功能

  今天项目完了,复盘了一下系统,发现还是有一些东西值得拿出来和大家分享一下。需求分析
  系统需要对用户的操作进行记录,方便未来溯源
  首先想到的就是在每个方法中,去实现记录的逻辑,但是这样做肯定是不现实的,首先工作量大,其次违背了软件工程设计原则(开闭原则)
  这种需求显然是对代码进行增强,首先想到的是使用SpringBoot提供的AOP结合注解的方式来实现功能实现1、需要一张记录日志的Log表
  导出的sql如下:mcams。tlogdefinitionCREATETABLEtlog(logidintNOTNULLAUTOINCREMENTCOMMENT日志编号,useridintNOTNULLCOMMENT操作人id,operationvarchar(128)NOTNULLCOMMENT用户操作,methodvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciDEFAULTNULLCOMMENT操作的方法,paramsvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciDEFAULTNULLCOMMENT方法的参数,ipvarchar(40)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciDEFAULTNULLCOMMENT用户的ip,createtimetimestampNULLDEFAULTNULLCOMMENT操作时间,costtimeintDEFAULTNULLCOMMENT花费时间,PRIMARYKEY(logid))ENGINEInnoDBAUTOINCREMENT189DEFAULTCHARSETutf8mb4COLLATEutf8mb40900aici;2、我使用的是SpringBoot所以需要引入springaop的starterdependencygroupIdorg。springframework。bootgroupIdspringbootstarteraopartifactIddependency
  如果是使用spring框架的,引入springaop即可3、Log实体类packagecom。xiaofengstu。mcams。web。entity;importcom。baomidou。mybatisplus。annotation。IdType;importcom。baomidou。mybatisplus。annotation。TableField;importcom。baomidou。mybatisplus。annotation。TableId;importcom。baomidou。mybatisplus。annotation。TableName;importjava。io。Serializable;importjava。time。LocalDateTime;importcom。fasterxml。jackson。annotation。JsonFormat;importlombok。Getter;importlombok。Setter;pauthorfengzengsince20220521GetterSetterTableName(tlog)publicclassTLogimplementsSerializable{privatestaticfinallongserialVersionUID1L;TableId(valuelogid,typeIdType。AUTO)privateIntegerlogId;操作人idTableField(userid)privateIntegeruserId;用户操作TableField(operation)privateStringoperation;TableField(method)privateStringmethod;TableField(params)privateStringparams;TableField(ip)privateStringip;JsonFormat(patternyyyyMMddHH:mm:ss)TableField(createtime)privateLocalDateTimecreateTime;TableField(costtime)privateLongcostTime;}
  需要lombok插件(gettersetter注解)4、ILog注解packagecom。xiaofengstu。mcams。annotation;importjava。lang。annotation。ElementType;importjava。lang。annotation。Retention;importjava。lang。annotation。RetentionPolicy;importjava。lang。annotation。Target;AuthorFengZengDate2022052100:48DescriptionTODOTarget(ElementType。METHOD)Retention(RetentionPolicy。RUNTIME)publicinterfaceILog{Stringvalue()default;}5、切面类LogAspectpackagecom。xiaofengstu。mcams。aspect;importcom。xiaofengstu。mcams。annotation。ILog;importcom。xiaofengstu。mcams。util。ThreadLocalUtils;importcom。xiaofengstu。mcams。web。entity。TLog;importcom。xiaofengstu。mcams。web。service。TLogService;importlombok。RequiredArgsConstructor;importorg。aspectj。lang。ProceedingJoinPoint;importorg。aspectj。lang。annotation。Around;importorg。aspectj。lang。annotation。Aspect;importorg。aspectj。lang。annotation。Pointcut;importorg。aspectj。lang。reflect。MethodSignature;importorg。springframework。core。LocalVariableTableParameterNameDiscoverer;importorg。springframework。stereotype。Component;importorg。springframework。web。context。request。RequestContextHolder;importorg。springframework。web。context。request。ServletRequestAttributes;importjavax。servlet。http。HttpServletRequest;importjava。lang。reflect。Method;importjava。time。LocalDateTime;AuthorFengZengDate2022052100:42DescriptionTODOAspectComponentRequiredArgsConstructorpublicclassLogAspect{privatefinalTLogServicelogService;Pointcut(annotation(com。xiaofengstu。mcams。annotation。ILog))publicvoidpointcut(){}Around(pointcut())publicObjectaround(ProceedingJoinPointpoint){Objectresultnull;longbeginTimeSystem。currentTimeMillis();try{resultpoint。proceed();}catch(Throwablee){e。printStackTrace();}longcostTimeSystem。currentTimeMillis()beginTime;saveLog(point,costTime);returnresult;}privatevoidsaveLog(ProceedingJoinPointpoint,longcostTime){通过point拿到方法签名MethodSignaturemethodSignature(MethodSignature)point。getSignature();通过方法签名拿到被调用的方法MethodmethodmethodSignature。getMethod();TLoglognewTLog();通过方法区获取方法上的ILog注解ILoglogAnnotationmethod。getAnnotation(ILog。class);if(logAnnotation!null){log。setOperation(logAnnotation。value());}StringclassNamepoint。getTarget()。getClass()。getName();StringmethodNamemethodSignature。getName();log。setMethod(className。methodName());获取方法的参数Object〔〕argspoint。getArgs();LocalVariableTableParameterNameDiscovererlnewLocalVariableTableParameterNameDiscoverer();String〔〕parameterNamesl。getParameterNames(method);if(args!nullparameterNames!null){StringBuilderparamnewStringBuilder();for(inti0;iargs。length;i){param。append()。append(parameterNames〔i〕)。append(:)。append(args〔i〕);}log。setParams(param。toString());}ServletRequestAttributesattributes(ServletRequestAttributes)RequestContextHolder。getRequestAttributes();HttpServletRequestrequestattributes。getRequest();log。setIp(request。getRemoteAddr());log。setUserId(ThreadLocalUtils。get());log。setCostTime(costTime);log。setCreateTime(LocalDateTime。now());logService。save(log);}}
  因为我使用的是Mybatisplus,所以logService。save(log);是mybatisplus原生的saveoperation
  这步其实就是把log插入到数据库
  6、使用
  只需要在方法上加上ILog注解,并设置它的value即可(value就是描述当前method作用)packagecom。xiaofengstu。mcams。web。controller;importcom。baomidou。mybatisplus。core。conditions。query。QueryWrapper;importcom。xiaofengstu。mcams。annotation。ILog;importcom。xiaofengstu。mcams。dto。BasicResultDTO;importcom。xiaofengstu。mcams。enums。RespStatusEnum;importcom。xiaofengstu。mcams。web。entity。TDept;importcom。xiaofengstu。mcams。web。service。TDeptService;importlombok。RequiredArgsConstructor;importorg。springframework。web。bind。annotation。GetMapping;importorg。springframework。web。bind。annotation。RequestMapping;importorg。springframework。web。bind。annotation。RequestParam;importorg。springframework。web。bind。annotation。RestController;importjava。util。List;p前端控制器authorfengzengsince20220507RestControllerRequestMapping(webdept)RequiredArgsConstructorpublicclassTDeptController{privatefinalTDeptServicedeptService;ILog(获取部门列表)GetMapping(list)publicBasicResultDTOListTDeptgetDeptListByCampId(RequestParam(campusId)IntegercampusId){returnnewBasicResultDTO(RespStatusEnum。SUCCESS,deptService。list(newQueryWrapperTDept()。eq(campusid,campusId)));}ILog(通过角色获取部门列表)GetMapping(listByRole)publicBasicResultDTOListTDeptgetDeptListByRole(){returnnewBasicResultDTO(RespStatusEnum。SUCCESS,deptService。listByRole());}}
  数据库:
  总结
  如果要对现有代码进行功能扩展,使用AOP注解不妨为一种优雅的方式
  对AOP不熟悉的小伙伴,可以深入了解一下,毕竟是spring最重要的特性之一。

生勤俭节约从我做起作文勤俭节约是中华民族的传统美德。小到一个人、一个家庭,大到一个国家、整个人类,想要生存,想要发展,都离不开勤俭节约这几个字。生活中,人们提倡光盘行动,可在学校的食堂里、饭店……老师,谢谢您作文500字ldquo;一日为师,终身为父。rdquo;如果说父母给了你生命,那么老师就教会了你行走。每当我们上课不认真听讲时,老师会丢给我们一个眼神,我们就立即坐端听讲,三跳比赛时……玫瑰的味道作文三篇玫瑰的味道1在我的想象中,玫瑰花的味道应该是甜蜜而浪漫的。若是把它不雅地吃到口中,也应该有一种清甜的味道,并在心里留下弥久不散的郁郁芬芳。但当我真正品尝到它的时候,我才发……我是一个乐高迷的叙事作文我是一个爱玩乐高的男孩子,我会拼各种各样的乐高。我一有时间就玩乐高,睡觉前玩,吃饭的时候玩,旅游的时候还玩可以说,我就是一个十足的乐高迷!有一天,我从早上就开始玩乐高,一……暑假补习的初中作文期末考试终于考完了,我们不知是该欢喜还是忧:考的好,一切都可以放松了;考不好,一切压力就从新压上来了。数学班,作文班,英语班数不胜数:舞蹈班,跆拳道班,游泳班更是目不暇接。有些……我家的仙人掌四年级状物作文800字我家养了两盆仙人掌,一盆已经死了,还有一盆活着。一盆死了,一盆活着,这是为什么呢?原来,妈妈把一盆仙人掌搬到阳台上,每天都为它浇水。而另一盆则被放进我房间里,从来不浇水。……2017年高考作文模拟题立意专家解析在文学艺术作品中,立意占有极重的分量。一件作品能不能成为传世佳作,往往就决定在立意上。下面是小编整理的高考作文模拟题立意专家解析,欢迎大家参考!【高考作文模拟题立意专家解……写出感悟深化意旨高考作文古人言,写作应认题立意,非识之高卓精审,无以中要。(刘熙载)就是说,写作当写出自己的高远出众的见识。高考考纲也要求作文要有意蕴,要深刻。如何做到有意蕴,如何达到深刻呢?这就要求……一个感人的细节作文俗话说:ldquo;细节决定成败。rdquo;小编收集了一个感人的细节作文,欢迎阅读。第一篇:一个感人的细节有人说,烟花是天空绽放的眼泪,那绚烂的色彩最美;可我要说……跑长途的大货车不烧柴油要改用新能源了?没电了到服务区换块电池长久以来,新能源汽车充电所引发的里程焦虑困扰着电动汽车车主。每逢节假日,高速公路服务区内排队数小时,充电几分钟的情形重复上演。在电动汽车领域,充电和换电的技术路线之争由来已久。……江南乌镇游记小学生作文5篇乌镇古镇是国家5A级景区,全国二十个黄金周预报景点及江南六大古镇之一。下面是小编准备的江南乌镇游记小学生作文,欢迎阅读。江南乌镇游记小学生作文篇1一条河流贯穿全镇,它以水……踢球作文300字踢球一般踢的是足球,而我这次踢的却是排球。晚饭前我本来是踢着逗妹妹玩的,结果变成了我和老爸的决战了。哈哈,我进球了。老爸高兴的喊着,而我在一边垂头丧气。不过这只是决赛前的……
俄媒称俄公司测试鸿蒙系统,华为正式回应来了本文原创,请勿抄袭和搬运,违者必究华为推广鸿蒙操作系统已经有几年的时间了,国内既有的华为手机和部分荣耀机型用户都支持升级鸿蒙系统。自去年6月份推出鸿蒙2。0正式版以……插电式混动汽车产销持续增长比亚迪加速行业布局来源:人民网人民网北京3月27日电(记者栗翘楚)近日,乘联会发布2月份数据显示,2月新能源车厂商批发渗透率21。8。分车型看,2月纯电动批发销量24。5万辆,同比增长16……俄媒俄公司受美制裁影响安卓被停止认证,已在测试鸿蒙系统据俄罗斯卫星通讯社27日报道,由于美国制裁,谷歌公司已经停止认证运行安卓管理系统的俄罗斯BQ公司的智能手机。该公司已经在测试中国华为的鸿蒙操作系统。俄罗斯BQ公司总经理弗……淘宝灰度测试微信支付京东首页改版内测中零售电商周报【亿邦原创】淘宝灰度测试微信支付;京东首页改版内测中,或将更偏向短视频化。又到了跟邦小白一起回顾一周电商大事的时候了!过去一周,零售电商领域发生了这些事。平台级动态……人祸不息天灾又至南北极同时出现异常高温预示全球灾难北半球和南半球的季节是完全相反的,当北半球处于冬天的时候南半球则是夏季,这是因为地球的自转轴是倾斜的,使得一个半球所获得的太阳光直射更多而另一个更少。太阳光照射得越多,那么空气……2013年海南高考同题作文人生得一知已足矣人生得一知已足矣作者:张界有资料显示,大约四成的学生认为同学间的关系缺乏信任。于是,有人立刻就有了这样的中国式思维套路:经济社会进步rarr;独生子女政策rarr;……落叶秋日联想六年级作文落红不是无情物,化作春泥更护花。落叶,也是如此。走进家乡的那片树林,踏着铺满落叶的羊肠小道,望着那些金黄的摇摇欲坠的秋叶,我心里不由得当起层层涟漪啊!谁说落叶无情,……为学杯A组我拿什么装点你,我的梦想观开学第一课有感有梦想的地方地狱也能变成天堂。mdash;mdash;题记是什么让我们有了前进的目标?是梦想!是什么让我们不再彷徨?是梦想!梦想是一种思念,梦想是一种行为,是一种坚……孔子的名言精选(带翻译)孔子是我们伟大思想家教育家政治家,我们需要多学习孔子的名言,有一颗宽厚的心,懂得推己及人,懂得舍己为人。下面小编为大家带来孔子的名言精选(带翻译),欢迎阅读。更多资讯尽在名人名……金融终端市场迎来智能化新浪潮,OpenHarmony商业发行自2020年9月发布1。0版本以来,OpenHarmony一直备受业界关注。与公众熟知的华为HarmonyOS不同,OpenHarmony是由开放原子开源基金会孵化及运营……东航MU5375航班飞行事故发生后,你有什么感悟吗?我在想一个问题,2014年马航空难,154名中国乘客遇难,其中大部分是芯片领域的科学家,那次事情算不算是一个未解之谜。出于对乘客的隐私保护,估计这次东航MU5375航班的坠机事……关爱作文500字五年级关爱是一首飘荡在夜空的歌谣,使孤苦无助的人获得心灵的慰藉。小编准备的关爱作文500字五年级,欢迎大家欣赏!关爱作文500字五年级范文1空对鸟儿的关爱,让鸟儿飞的更高,海水……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网