网站上线有什么线上活动可以做,龙华建网站多少钱,查找网站备案号,音乐网站用什么语言做夫陶公清风千古#xff0c;余又何人#xff0c;敢称庶几 文章目录前言一、系统日志是什么二、开发技术三、开发步骤3.1引入依赖坐标3.1.1 导入Lombok3.1.2 数据库连接依赖3.1.3 spring aop依赖3.1.4 aspectJ依赖3.1.5 Druid连接池#xff08;阿里巴巴#xff09;3.1.6 myb… 夫陶公清风千古余又何人敢称庶几 文章目录前言一、系统日志是什么二、开发技术三、开发步骤3.1引入依赖坐标3.1.1 导入Lombok3.1.2 数据库连接依赖3.1.3 spring aop依赖3.1.4 aspectJ依赖3.1.5 Druid连接池阿里巴巴3.1.6 mybatis-plus依赖3.2配置application.yml3. 3编写实体类3.4.1系统用户实体3.4.2 日志实体3.4 编写日志注解3.5 编写通知类3.6 编写mapper3.6.1 LogMapper3.6.2 UserMapper3.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最终通知
提示以下是本篇文章正文内容下面案例可供参考
一、系统日志是什么
系统日志是记录系统中硬件、软件和系统问题的信息同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用程序日志和安全日志。
二、开发技术
idea 2019SpringBootMybatisPlusDruid连接池
三、开发步骤
3.1引入依赖坐标
3.1.1 导入Lombok
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.16/versionscopeprovided/scope
/dependency3.1.2 数据库连接依赖
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.48/version
/dependency3.1.3 spring aop依赖
dependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.12.RELEASE/version
/dependency3.1.4 aspectJ依赖
dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.2.12.RELEASE/version
/dependency3.1.5 Druid连接池阿里巴巴
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.4/version
/dependency3.1.6 mybatis-plus依赖
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.1/version
/dependency3.2配置application.yml
server:port: 8088
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/aop-test?useSSLfalseuseUnicodetruecharacterEncodingUTF-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
简单解释一下这里继承了一个BaseMapperSysLog类通过继承该类 我们就可以使用mybatis plus里的方法里面实现常用的操作比如CRUD。
public interface LogMapper extends BaseMapperSysLog {
}3.6.2 UserMapper
/*** p系统用户数据层/p* author XinLiu*/
public interface UserMapper extends BaseMapperSysUser {
}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 IServiceSysUser {/*** 用户注册* param sysUser 用户实体* return*/public boolean reg(SysUser sysUser);/*** 查询所有的用户* return*/public ListSysUser queryAllUser();
}3.7.2 UserService实现代码
Service
public class UserServiceImpl extends ServiceImplUserMapper,SysUser implements UserService {Autowiredprivate UserMapper userMapper;/*** 用户注册** param sysUser 用户实体* return*/OverrideLog(用户注册)public boolean reg(SysUser sysUser) {return userMapper.insert(sysUser)0;}OverrideLog(查询所有的用户)public ListSysUser queryAllUser() {return userMapper.selectList(new QueryWrapperSysUser());}
}四、代码测试
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(){ListSysUser sysUsers userService.queryAllUser();sysUsers.forEach(sysUser - System.out.println(sysUser));}运行结果
总结
提示这里对文章进行总结 例如以上就是今天要讲的内容本文仅仅简单介绍了如何通过注解的方式实现日志以及AspectJ的使用 对一个小白入门是有一些帮助的此文也有很多东西未实现因为没有写前端所有日志中没有保存访问的用户。