原来记录系统日志那么简单【Java】【SpringBoot】【Mybatis Plus】【AspcetJ】

夫陶公清风千古,余又何人,敢称庶几
在这里插入图片描述

文章目录

  • 前言
  • 一、系统日志是什么
  • 二、开发技术
  • 三、开发步骤
    • 3.1引入依赖坐标
      • 3.1.1 导入Lombok
      • 3.1.2 数据库连接依赖
      • 3.1.3 spring aop依赖
      • 3.1.4 aspectJ依赖
      • 3.1.5 Druid连接池(阿里巴巴)
      • 3.1.6 mybatis-plus依赖
    • 3.2配置application.yml
    • 3. 3编写实体类
      • 3.4.1系统用户实体
      • 3.4.2 日志实体
    • 3.4 编写日志注解
    • 3.5 编写通知类
    • 3.6 编写mapper
      • 3.6.1 LogMapper
      • 3.6.2 UserMapper
      • 3.6.3 编写mybaits-plus配置类
    • 3.7 编写service层
      • 3.7.1 UserService接口
      • 3.7.2 UserService实现代码
  • 四、代码测试
    • 4.1 编写测试类
    • 4.2 测试添加用户
    • 4.3 测试查看所有用户
  • 总结


前言

本文是对面向切面编程的简单应用。下文中用到的是后置通知实现日志的记录,当该方法执行以后,记录相关的日志信息。AspectJ中常用的注解:
@AspectJ:定义一个切面
@Before:前置通知
@AfterReturning:后置通知
@Around:环绕通知
@AfterThrowing:异常通知
@After:最终通知

提示:以下是本篇文章正文内容,下面案例可供参考

一、系统日志是什么

系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用程序日志和安全日志。

二、开发技术

  1. idea 2019
  2. SpringBoot
  3. MybatisPlus
  4. Druid连接池

三、开发步骤

3.1引入依赖坐标

3.1.1 导入Lombok

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope>
</dependency>

3.1.2 数据库连接依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version>
</dependency>

3.1.3 spring aop依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.12.RELEASE</version>
</dependency>

3.1.4 aspectJ依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.12.RELEASE</version>
</dependency>

3.1.5 Druid连接池(阿里巴巴)

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.4</version>
</dependency>

3.1.6 mybatis-plus依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version>
</dependency>

3.2配置application.yml

server:port: 8088
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/aop-test?useSSL=false&useUnicode=true&characterEncoding=UTF-8username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver

代码如下(示例):

3. 3编写实体类

3.4.1系统用户实体


/*** <p>用户实体</p>* @author XinLiu */
@Data
@ToString
@TableName(value = "sysUser")
public class SysUser {/*** 主键*/@TableIdprivate String id;/*** 用户名*/@TableField("name")private String name;/*** 密码*/@TableField("password")private String password;/*** 创建时间*/@TableField("createDate")private Date createDate;
}

对应的数据表:

在这里插入图片描述

3.4.2 日志实体

/*** <p>日志实体</p>* @author XinLiu */
@Data
@ToString
@TableName("log")
public class SysLog {/*** 主键*/@TableIdprivate String id;/*** 访问的类名*/@TableField("className")private String className;/*** 执行的操作*/@TableField("methodName")private String methodName;/*** 创建日志时间*/@TableField("createDate")private Date createDate;}

对应的数据表:
在这里插入图片描述

3.4 编写日志注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {/*** 执行操作的名称* @return 操作名*/String value() ;
}

3.5 编写通知类

这里其实是面向切面编程的典型应用,此处日志的实现用到了后置通知,也就是当访问的方法正确返回时执行此后置通知。首先我们需要编写一个切入点,也就是声明要执行那个方法或者那些方法,前面我们自定义了一个注解:@Log,此注解有一个属性value,它的作用是用于保存执行指定操作的名称;接下来我们需要编写一个后置通知,也就是增强的方法,方法需要一个参数JoinPoint joinPoint,通过它可以获得@Log注解,通过反射可以获得注解上的值,这个值就是操作名称,我们需要保存到日志表中;编写好通知后,我们就可以保存我们需要保存的日志信息了,比如:访问者用户名、请求参数、请求的URI、请求者IP地址、执行的操作等等。


/**<p>通知类</p>* @author XinLiu */
@SuppressWarnings("all")
@Component
@Aspect
public class LogAdvice {@Autowiredprivate LogMapper logMapper;/*** 配置切入点*/@Pointcut("@annotation(com.qingfeng.aoptest.common.anno.Log)")private void serviceAspect() {}/*** 后置通知,用于记录日志** @param joinPoint* @return* @throws Throwable*/@AfterReturning("serviceAspect()")public void doBefore(JoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method method = methodSignature.getMethod();Log log = method.getAnnotation(Log.class);SysLog sysLog = new SysLog();sysLog.setId((UUID.randomUUID().toString()).replaceAll("-", ""));sysLog.setClassName(joinPoint.getTarget().getClass().getName());sysLog.setMethodName(log.value());sysLog.setCreateDate(new Date());logMapper.insert(sysLog);}
}

3.6 编写mapper

3.6.1 LogMapper

简单解释一下,这里继承了一个BaseMapper<SysLog>类,通过继承该类 ,我们就可以使用mybatis plus里的方法,里面实现常用的操作,比如CRUD

public interface LogMapper extends BaseMapper<SysLog> {
}

3.6.2 UserMapper

/*** <p>系统用户数据层</p>* @author XinLiu*/
public interface UserMapper extends BaseMapper<SysUser> {
}

3.6.3 编写mybaits-plus配置类

这是一个配置类,@Configuration注解的作用是,将此类交给ioc容器处理;@MapperScan("com.qingfeng.aoptest.mapper")的作用是扫描该包路径下的所有mapper接口,简化每次都要在mapper类上添加注解:@Mapper,如果配置了此类,就可以不用写@Mapper注解了。

@Configuration
@MapperScan("com.qingfeng.aoptest.mapper")
public class MybatisPlusConfig {
}

3.7 编写service层

3.7.1 UserService接口

/*** @author XinLiu*/
public interface UserService extends IService<SysUser> {/*** 用户注册* @param sysUser 用户实体* @return*/public boolean reg(SysUser sysUser);/*** 查询所有的用户* @return*/public List<SysUser> queryAllUser();
}

3.7.2 UserService实现代码

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,SysUser>  implements UserService    {@Autowiredprivate UserMapper userMapper;/*** 用户注册** @param sysUser 用户实体* @return*/@Override@Log("用户注册")public boolean reg(SysUser sysUser) {return userMapper.insert(sysUser)>0;}@Override@Log("查询所有的用户")public List<SysUser> queryAllUser() {return userMapper.selectList(new QueryWrapper<SysUser>());}
}

四、代码测试

4.1 编写测试类

@SpringBootTest
@RunWith(SpringRunner.class)
class AopTestApplicationTests {@Autowiredprivate UserService userService;@Testvoid contextLoads() {}}

4.2 测试添加用户

@Test
public void testReg(){System.out.println(userService);SysUser sysUser = new SysUser();sysUser.setCreateDate(new Date());sysUser.setId((UUID.randomUUID().toString()).replaceAll("-",""));sysUser.setName("admin");sysUser.setPassword("123456");userService.reg(sysUser);}

运行结果:

在这里插入图片描述
在这里插入图片描述

4.3 测试查看所有用户

@Testpublic void  testFindAll(){List<SysUser> sysUsers = userService.queryAllUser();sysUsers.forEach(sysUser -> System.out.println(sysUser));}

运行结果:
在这里插入图片描述

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何通过注解的方式实现日志,以及AspectJ的使用, 对一个小白入门是有一些帮助的,此文也有很多东西未实现,因为没有写前端,所有日志中没有保存访问的用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员风光背后:从零到今日头条数据分析师,我走了1年!

笔者最近在今日头条上&#xff0c;看到了头条员工的自述&#xff1a;“从什么都不懂的小白&#xff0c;到入职头条成为数据分析工程师&#xff0c;我走了1年的时间。”评论区却炸锅了&#xff01;大家不明白&#xff0c;1年时间为什么要学这个&#xff1f;半年时间学Java不香吗…

前端内存优化的探索与实践

引言 标注是地图最基本的元素之一&#xff0c;标明了地图每个位置或线路的名称。在地图 JSAPI 中&#xff0c;标注的展示效果及性能也是需要重点解决的问题。 新版地图标注的设计中&#xff0c;引入了 SDF &#xff08; signed distance field&#xff09;重构了整个标注部分…

直播:AI时代,普通程序员该如何转人工智能(限免报名)

常常有小伙伴在后台反馈&#xff1a;想了解人工智能&#xff0c;但是该怎么学&#xff1f;自学难度大又没有效果&#xff0c;该怎么办&#xff1f;CSDN为了解决这个难题&#xff0c;联合唐宇迪老师为大家带来了一场精彩的直播【年薪百万AI工程师亲授&#xff1a;小白实战培养计…

核心系统100%上云!全球最大流量洪峰,阿里云扛住了

2019天猫双11 96秒成交额破100亿 全球最大流量洪峰 每秒订单峰值54.4万笔 阿里巴巴核心系统 100%上云 我们扛住了&#xff01; 1心1役 把不可能变成可能 今晚为阿里工程师疯狂打call&#xff01; 原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

如何通过可视化的方式实现Linux和Windows互相传送文件[命令]

文章目录&#x1f3b5;安装&#x1f3b5;使用&#x1f496;1.上传文件&#x1f496;2. 下载文件&#x1f3b5;总结&#x1f3b5;安装 【Centos】 yum install -y lrzsz&#x1f3b5;使用 &#x1f496;1.上传文件 rz -y&#x1f496;2. 下载文件 sz filename&#x1f3b5;…

万字长文丨1分36秒,100亿,支付宝技术双11答卷:没有不可能

2019年双11来了。1分36秒100亿&#xff0c;5分25秒超过300亿&#xff0c;12分49秒超500亿……如果没有双11&#xff0c;中国的互联网技术要发展到今天的水平&#xff0c;或许要再多花20年。 从双11诞生至今的11年里&#xff0c;有一个场景始终在支付宝技术团队之中循环往复——…

大数据 Spark :利用电影观看记录数据,进行电影推荐 | 原力计划

作者 | lomtom责编 | 王晓曼出品 | CSDN博客准备1、任务描述在推荐领域有一个著名的开放测试集&#xff0c;下载链接是&#xff1a;http://grouplens.org/datasets/movielens/&#xff0c;该测试集包含三个文件&#xff0c;分别是ratings.dat、sers.dat、movies.dat&#xff0c…

大家都关注的Serverless,阿里怎么做的?

作者|陈仲寅&#xff08;张挺&#xff09; 出品|阿里巴巴新零售淘系技术部 本文是阿里巴巴前端技术专家-张挺&#xff0c;在 JSConf China 「中国开发者大会」上分享的《面向传统&#xff0c;Serverless 进化之路》&#xff0c;主要讲述阿里集团内部逐步迁移到 Serverless 体系…

我的第一个Go程序

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 文章目录介绍技术网站入门程序介绍 &#x1f4a1;官网介绍 Go 是一门开放源代码的编程语言&#xff0c;可轻松构建简单&#xff0c;可靠且高效的软件。 &#x1f4a1;百度百科 Go&#xff08;又称 Golang&#xff09;…

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云&#xff0c;一朵是阿里云&#xff0c;一朵叫其他云。”11月11日晚&#xff0c;阿里巴巴集团CTO张建锋表示&#xff0c;“阿里云不一样&#xff0c;10年前我们从第一行代码写起&#xff0c;构建了中国唯一自研的云操作系统飞天。…

阿里CTO张建锋:明年双11将大规模应用含光AI芯片

11月11日晚&#xff0c;阿里巴巴集团CTO张建锋宣布重磅消息&#xff0c;明年双11将大规模应用平头哥自研的含光AI芯片。 达摩院研发的AI技术已应用于天猫双11的各个场景。未来&#xff0c;这些人工智能应用将会越来越多跑在阿里自研的芯片上。 2019年9月25日杭州云栖大会上&am…

shell脚本报错“^M: bad interpreter”解决方法

文章目录1. 现象2. 先编辑脚本3. 脚本观察4. 脚本格式调整5. 脚本格式查看6. 保存脚本7. 重新运行脚本1. 现象 bash: ./ry.sh: /bin/sh^M: bad interpreter: No such file or directory2. 先编辑脚本 # 首先编辑脚本 [rootnode2 ruoyi]# vim ry.sh# 3. 脚本观察 这时会看到文…

深入解析final关键字的用法

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://blog.breez.work 文章目录介绍解析final属性final方法final参数final类介绍 final用于声明属性【属性不可变】、方法【方法不可覆盖】、类&#xff08;除了抽象类&#xff09;【类不…

出道50年+!乘风破浪的编程语言们,能二次翻红吗?

来源 | 编程技术宇宙责编| Carol继上次哈希表华山论剑之后&#xff0c;比特宇宙编程语言联合委员会又来搞事情了。委员会要做一套全新的系统&#xff0c;涉及后端、前端、客户端三大块&#xff0c;为选择什么样的语言组合拿不定主意。为了体现公平&#xff0c;委员会特举办一次…

Spotify如何使用Cassandra实现个性化推荐

在Spotify我们有超过6000万的活跃用户&#xff0c;他们可以访问超过3000万首歌曲的庞大曲库。用户可以关注成千上万的艺术家和上百个好友&#xff0c;并创建自己的音乐图表。在我们的广告平台上&#xff0c;用户还可以通过体验各种音乐宣传活动&#xff08;专辑发行&#xff0c…

RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)

接上一篇&#xff1a;RuoYi-Vue 部署 Linux环境 若依前后端分离项目&#xff08;jar包nginx 单机版本&#xff09; 前端和后端不在一个服务器上&#xff0c;如何部署呢&#xff1f; 文章目录1. 服务器和软件部署2. 后端部署3. 前端部署4. 登录5. 效果图1. 服务器和软件部署 服…

三个不同线程顺序打印ABC十种写法【并发编程JUC】

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://www.breez.work &#x1f4d6;写法一&#xff1a;使用信号量Semaphore public class Foo {private Semaphore semaphoreB new Semaphore(0);private Semaphore semaphoreC new Sem…

技术直播:数据科学到底该怎么“玩”?

90年代初&#xff0c;王健林抓住的房地产的机遇&#xff0c;现在才敢说“一个亿的小目标”&#xff1b;千禧年后 &#xff0c;“马爸爸”抓住了电商的机遇&#xff0c;现在才能说“我对钱没有兴趣”。今年由于特殊情况&#xff0c;加速了远程办公、在线教育和在线医疗的发展&am…

Apache Flink 为什么能够成为新一代大数据计算引擎?

众所周知&#xff0c;Apache Flink&#xff08;以下简称 Flink&#xff09;最早诞生于欧洲&#xff0c;2014 年由其创始团队捐赠给 Apache 基金会。如同其他诞生之初的项目&#xff0c;它新鲜&#xff0c;它开源&#xff0c;它适应了快速转的世界中更重视的速度与灵活性。 大数…

超燃!支付宝技术双11纪录片《一心一役》全球独家首发

​和过去10年一样&#xff0c;2019年天猫双11又创造了一个全新的纪录。 这个数字背后&#xff0c;是数代支付宝工程师们殚精竭虑、不断突破技术难关。 今年双11之前&#xff0c;小编邀请到11位经历双11的技术同学口述实录&#xff0c;特别筹备了纪录片《一心一役》&#xff0c…