您好,登錄后才能下訂單哦!
前言
在我們日常的開發過程中通過打印詳細的日志信息能夠幫助我們很好地去發現開發過程中可能出現的Bug
,特別是在開發Controller
層的接口時,我們一般會打印出Request
請求參數和Response
響應結果,但是如果這些打印日志的代碼相對而言還是比較重復的,那么我們可以通過什么樣的方式來簡化日志打印的代碼呢?
SpringBoot 通過自定義注解實現權限檢查可參考我的博客:SpringBoot 通過自定義注解實現權限檢查
正文
Spring AOP
Spring AOP 即面向切面,是對OOP
面向對象的一種延伸。
AOP
機制可以讓開發者把業務流程中的通用功能抽取出來,單獨編寫功能代碼。在業務流程執行過程中,Spring
框架會根據業務流程要求,自動把獨立編寫的功能代碼切入到流程的合適位置。
我們通過AOP
機制可以實現:Authentication
權限檢查、Caching
緩存、Context passing
內容傳遞、Error handling
錯誤處理、日志打印等功能,這里我們講一下怎么用Spring AOP
來實現日志打印。
SpringBoot通過自定義注解實現日志打印
Maven依賴
<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> <!--Spring AOP--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
ControllerMethodLog.class自定義注解
@Retention
: 用來修飾注解,是注解的注解,稱為元注解。@Target
:用來說明對象的作用范圍@Documented
:用來做標記使用/** * 自定義注解用于打印Controller層方式日志 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ControllerMethodLog { }
這里特別講一下@Retention
,按生命周期來劃分可分為3類:
RetentionPolicy.SOURCE
:注解只保留在源文件,當Java
文件編譯成class
文件的時候,注解被遺棄(運行時去動態獲取注解信息);RetentionPolicy.CLASS
:注解被保留到class
文件,但jvm
加載class
文件時候被遺棄,這是默認的生命周期(在編譯時進行一些預處理操作);RetentionPolicy.RUNTIME
:注解不僅被保存到class
文件中,jvm
加載class
文件之后,仍然存在(做一些檢查性的操作);這3個生命周期分別對應于:Java
源文件(.java
文件) —> .class
文件 —> 內存中的字節碼。
Spring AOP切面方法的執行順序
這里簡單介紹一下,切面的執行方法和其執行順序:
@Around
通知方法將目標方法封裝起來@Before
通知方法會在目標方法調用之前執行@After
通知方法會在目標方法返回或者異常后執行@AfterReturning
通知方法會在目標方法返回時執行@Afterthrowing
通知方法會在目標方法拋出異常時執行這里以一個返回正常的情況為例:(異常替換最后一步即可)
ControllerMethodLogAspect.class:用于打印日志的切面定義類
注意要在啟動類掃描這個class
,并且添加 @EnableAspectJAutoProxy(proxyTargetClass = true)
@Slf4j @Component @Aspect public class ControllerMethodLogAspect { @Pointcut("@annotation(com.xiyuan.demo.annotation.ControllerMethodLog)") public void pointCut() { } /** * 在切點運行前執行該方法 */ @Before("pointCut()") public void doBefore(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class); if (Objects.isNull(annotation)) { return; } String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); log.info("start {}:入參:{}", methodName, JSON.toJSONString(joinPoint.getArgs())); } /** * 在切點運行后,無異常時執行該方法 * * @param joinPoint * @param result */ @AfterReturning(value = "pointCut()", returning = "result") public void afterReturn(JoinPoint joinPoint, Object result) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class); if (Objects.isNull(annotation)) { return; } String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); log.info("end {}:響應:{}", methodName, JSON.toJSONString(result)); } }
驗證
getUserById:根據id獲取用戶的信息
@GetMapping("/getUserById") @ApiOperation(value = "根據用戶id獲取用戶") @ControllerMethodLog public ResponseResult getUserById(@RequestParam(name = "id", required = true) String id) { UserInfoPojo userInfoPojo = userService.getUserById(id); return ResponseResult.success(userInfoPojo, ConstantsUtil.QUERY_SUCCESS); }
Swagger接口信息如下:
IDEA控制臺打印信息如下:
總結
到此這篇關于SpringBoot通過自定義注解實現日志打印的示例代碼的文章就介紹到這了,更多相關SpringBoot自定義注解日志打印內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。