原来记录系统日志那么简单【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:最終通知
提示:以下是本篇文章正文內容,下面案例可供參考
一、系統日志是什么
系統日志是記錄系統中硬件、軟件和系統問題的信息,同時還可以監視系統中發生的事件。用戶可以通過它來檢查錯誤發生的原因,或者尋找受到攻擊時攻擊者留下的痕跡。系統日志包括系統日志、應用程序日志和安全日志。
二、開發技術
三、開發步驟
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的使用, 對一個小白入門是有一些幫助的,此文也有很多東西未實現,因為沒有寫前端,所有日志中沒有保存訪問的用戶。
總結
以上是生活随笔為你收集整理的原来记录系统日志那么简单【Java】【SpringBoot】【Mybatis Plus】【AspcetJ】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VBA 用 Environ 获取系统环境
- 下一篇: java信息管理系统总结_java实现科