Springboot自定義注解&傳參&簡單應(yīng)用方式
Springboot自定義注解&傳參&簡單應(yīng)用
1、目錄結(jié)構(gòu)
1.1 annotation為自定義注解位置
2、自定義注解
2.1 自定義兩個注解LogController、TimeConsuming用來記錄日志和統(tǒng)計方法耗時,其中LogController有三個參數(shù)
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogController { // 具體操作 String description(); // 日志級別 int logLevel() default LogLevelConstant.INFO; // 日志進(jìn)程/方法名 String method(); }
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TimeConsuming { }
3、注解使用
3.1 在需要記錄日志和統(tǒng)計方法耗時的方法上使用注解
@PostMapping("/createUser") @LogController(description = "創(chuàng)建用戶", method = "/createUser") @TimeConsuming public ResponseEntity<ResponseResultVO> createUser(@Valid @RequestBody SysUsersVo sysUsersVo) { log.info("UserManager = start create user [{}] pwd [{}]", sysUsersVo.getUserName(), sysUsersVo.getUserPwd()); return ResponseEntity.ok(usersService.createUser(sysUsersVo).orElse(ResponseResultVO.builder() .code(ErrorCodeConstant.SYSTEM_ERROR) .msg(ErrorMsgConstant.SYSTEM_ERROR) .build())); }
4、使用Aspect實(shí)現(xiàn)功能
4.1 通過Aop以注解作為切點(diǎn)切入方法,實(shí)現(xiàn)業(yè)務(wù)功能
@Pointcut("@annotation(com.pet.annotation.LogController)") public void annotationPoint() { } @Pointcut("@annotation(com.pet.annotation.TimeConsuming)") public void methodTimePoint() { }
4.2 取注解中參數(shù)
比如下面方法實(shí)現(xiàn)記錄日志功能
@Before(value = "annotationPoint() && @annotation(logController)", argNames = "joinPoint, logController") public void beforeController(JoinPoint joinPoint, LogController logController) { HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); HttpSession session = request.getSession(); SysUsers user = (SysUsers) session.getAttribute(HttpConstant.SESSION_USER); String realMethodName = joinPoint.getSignature().getName(); log.info("Aspect = [{}] ,user [{}] , method [{}] , logLevel [{}] , do [{}] , realMethod [{}]", new Date(), user == null ? "system" : user.getUserName(), logController.method(), logController.logLevel(), logController.description(), realMethodName); // 異步處理日志 publisher.publishEvent(new LogToDbEvent( LogToDbEventEntity.builder() .date(new Date()) .userName(user == null ? "system" : user.getUserName()) .method(logController.method()) .logLevel(logController.logLevel()) .description(logController.description()) .realMethod(realMethodName) .build())); }
統(tǒng)計方法耗時方法
@Around(value = "methodTimePoint()") public Object apiTimeConsuming(ProceedingJoinPoint pjp) throws Throwable { long begin = System.currentTimeMillis(); String method = pjp.getSignature().getName(); String className = pjp.getTarget().getClass().getName(); Object ret = pjp.proceed(); log.info("Aspect = [{}] ,class [{}] , method [{}] , time consuming[{}]", new Date(), className, method, System.currentTimeMillis() - begin); return ret; }
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot2.0整合WebSocket代碼實(shí)例
這篇文章主要介紹了SpringBoot2.0整合WebSocket代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Java鏈表中元素刪除的實(shí)現(xiàn)方法詳解【只刪除一個元素情況】
這篇文章主要介紹了Java鏈表中元素刪除的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java只刪除鏈表中一個元素的相關(guān)操作原理、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringBoot2底層注解@Configuration配置類詳解
這篇文章主要為大家介紹了SpringBoot2底層注解@Configuration配置類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot?+?Vue?+?ElementUI?實(shí)現(xiàn)?el-table?分頁功能(詳細(xì)步驟)
本文詳細(xì)介紹了使用SpringBoot和Vue.js結(jié)合ElementUI實(shí)現(xiàn)分頁功能的數(shù)據(jù)表格,從后端分頁邏輯到前端展示和狀態(tài)管理,全面解析如何高效處理大量數(shù)據(jù),提升用戶體驗(yàn)與系統(tǒng)性能,感興趣的朋友跟隨小編一起看看吧2024-09-09