SpringBoot中使用SpringAop实现日志记录功能
一、创建日志注解
1、日志类型枚举类 import lombok.Getter; /** * 日志类型枚举类 */ @Getter public enum LogType { /** * 登录 */ login("LoginLog"); /** * 实现类名称 */ private final String implClassName; LogType(String implClassName) { this.implClassName = implClassName; } }
2、自定义日志注解 import java.lang.annotation.*; import com.baige.enums.LogType; /** * 自定义日志注解 * * 注解说明: * @Documented:文档注解 * @Retention(RetentionPolicy.RUNTIME):生命周期注解,注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 * @Target({ ElementType.PARAMETER, ElementType.METHOD }):@Target说明了Annotation所修饰的对象范围,ElementType.TYPE:接口、类、枚举、注解,ElementType.METHOD:方法 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.PARAMETER, ElementType.METHOD }) public @interface Log { /** * 登录类型 */ LogType logType(); }
二、利用AOP实现日志切面统一处理
1、日志实现类创建工厂 import com.baige.enums.LogType; import com.baige.util.SpringContextHolder; import org.springframework.context.ApplicationContext; /** * 日志实现类创建工厂 */ public class LogFactory { public static ApplicationContext context; public static IUserLog getInstance(LogType logType) { return (IUserLog) SpringContextHolder.getBean(logType.getImplClassName()); } }
2、切面类 import lombok.extern.slf4j.Slf4j; import com.baige.aop.log.IUserLog; import com.baige.aop.annotation.Log; import com.baige.aop.log.LogFactory; import org.aspectj.lang.annotation.*; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; @Slf4j @Aspect @Component public class LogAspect { /** * 定义切入点,切入点为com.baige.controller.AopController中的所有函数 * 通过@Pointcut注解声明频繁使用的切点表达式 */ @Pointcut("execution(public * com.baige.controller.UserController.*(..)))") public void pointcut() { } @Around("pointcut()") public void doAround(ProceedingJoinPoint pjp) { try { MethodSignature methodSignature = (MethodSignature) pjp.getSignature(); Log log = methodSignature.getMethod().getAnnotation(Log.class); IUserLog userLog = LogFactory.getInstance(log.logType()); userLog.addLog(pjp, log); } catch (Throwable throwable) { log.info("日志记录异常,不影响正常业务", throwable); } } }
三、创建日志实现类
1、添加日志接口 import com.baige.aop.annotation.Log; import org.aspectj.lang.ProceedingJoinPoint; import java.net.UnknownHostException; public interface IUserLog { /** * 添加日志 */ int addLog(ProceedingJoinPoint pjp, Log log) throws UnknownHostException; }
2、添加日志接口实现类 import java.util.Date; import java.net.InetAddress; import java.net.UnknownHostException; import lombok.AllArgsConstructor; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Component; import com.baige.domain.User; import com.baige.domain.UserLog; import com.baige.aop.log.IUserLog; import com.baige.mapper.UserMapper; import com.baige.aop.annotation.Log; import com.baige.mapper.UserLogMapper; @AllArgsConstructor @Component("LoginLog") public class LoginLog implements IUserLog { private final UserMapper userMapper; private final UserLogMapper userLogMapper; @Override public int addLog(ProceedingJoinPoint pjp, Log log) throws UnknownHostException { UserLog userLog = new UserLog(); Object[] params = pjp.getArgs(); if (params.length > 0) { User param = (User) params[0]; User user = userMapper.getOne(param.getLoginName(), param.getLoginPassword()); if (user != null) { userLog.setUserId(user.getId()); userLog.setContent("获取用户信息成功"); } else { userLog.setContent("未获取到用户信息"); } } userLog.setIpAddress(InetAddress.getLocalHost().getHostAddress()); userLog.setCreateTime(new Date()); return userLogMapper.insert(userLog); } }
四、controller package com.baige.controller; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import com.baige.domain.User; import com.baige.enums.LogType; import com.baige.aop.annotation.Log; import com.baige.service.UserService; @RestController @AllArgsConstructor @RequestMapping("/user") public class UserController { private final UserService userService; @PostMapping("/login") @Log(logType = LogType.login) public String login(@RequestBody User params) { User user = userService.login(params.getLoginName(), params.getLoginPassword()); return user != null ? "登录成功" : "登录失败"; } }路漫漫其修远兮,吾将上下而求索
译文:在追寻真理方面,前方的道路还很漫长,但我将百折不挠,不遗余力地去追求和探索。
如果您有什么好的想法与方法,欢迎在评论区留言,我们一起讨论~
头腾撕逼大战,为什么大多数媒体人都亲腾讯?近来头条和腾讯的撕逼大战一直没有停过,先是朋友圈高层互怼,接着是各自利用各种的媒体资源互黑,抖音被腾讯屏蔽事情,抖音提示腾讯屏蔽自己,再到头条今日推送的多少道文件才能管住网游对少年
盘点捷德奥特曼中的贝利亚融合兽贝利亚融合兽是伏井出矽(斯特鲁姆星人,如果贝利亚不给力量就不能进行融合升华)或贝利亚奥特曼使用贝利亚升华器(贝利亚升华器只有一个)融合升华两个怪兽胶囊和贝利亚奥特曼融合而成。斯卡鲁
滴滴搞事情?公然向多地停车场内车辆贴罚单对广大车主来说,爱车上一言不合就被贴罚单可以说是最为恼火的事。正是如此,使得车主们更为遵章停车,尤其是停在停车场,可是让车主们最为放心的。然而,即便如此,也未能躲过被违章。今日,在
微信封杀是中国互联网公司躲不过的坎儿这两天,王欣,罗永浩,头条一起发布了三款社交产品,其中一款王欣发布的产品马桶刚上线一天多就被微信封杀,这个事情目前成为了热点,也引起了大家的激烈的讨论,有支持微信的,有支持马桶的,
近期的热门事件国家帮我们出了一口恶气!这几天的事件我想大家都知道了,奔驰女维权,视觉中国,996等事件很火,特别是一件接着一件,而且是持续火爆,有点你方唱罢我来登台的样子,不像以前的网络事件,这个火了,那个就没人关注了
侏儒北欧神话中的类人生物侏儒北欧地区写法Dvergr单数Dvergar众数(儒威尔格)Svartlfar(黑精灵)Dkklfar(暗精灵)是许多奇幻作品中虚构生物矮人(Dwarf)的原型。和另一种虚构生物
索尼发布1英寸图像传感器手机XperiaPROI,却只用近60的面积索尼1英寸图像传感器手机XperiaPROI发布被称为能打电话的相机,主摄镜头镜头来自于中国诚瑞光学的1G5P玻塑混合镜头。2021年10月26日,索尼中国宣布推出摄影旗舰微单手机
看了看很多招聘需求,感觉这些公司未来都是要倒闭的这几天浏览某个招聘网站,发现很多招聘的人员都非常的不专业,不专业会导致什么?招聘不到人才,或者找到人才后,不符合公司的要求。其实招聘是一个非常重要的事情,googleCEO拉里佩奇
无助,太难!被无赖美国公司拖款的九十多天一直没想到,有一天,讨债者,这样的词与我会发生关系。在写这篇文章的时候,很多朋友都劝我,不要闹大了,这样搭上自己公司的未来不值得,但是我认为,士可杀不可辱,我未来即使不做这个行业了
光之国第一个堕落入黑暗的奥特战士贝利亚奥特曼剧中设定为昭和系M78星云奥特之星光之国的黑暗奥特曼。在2009年上映的电影宇宙英雄之超银河传说初登场,曾是与奥特之父同时期的战友,在奥特大战争后受到等离子火花塔的力量的诱惑而堕落
爱普生亮相第四届进博会以智慧科技承发展之脉,绿动未来(ChinaIT。com讯)第四届中国国际进口博览会(以下简称进博会)如约在上海国家会展中心隆重召开,作为世界上第一个以进口为主题的国家级博览盛会,在大力推动大循环双循环的新发展格