詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息
前言
不積跬步無以至千里,不積小流,無以成江海
在公司一般來說,都只會接觸一些CRUD的業(yè)務,很多時候可能你想設計很多的代碼結構,但是時間不允許。近期接到一個項目,領導說要擴展、要兼容、等等等。然后我就想著那我就花點時間把代碼結構設計一下,然后給出排期,當領導看到我的排期時間的時候,他跟我說,我們要小步快跑,我覺得他在CPU我,明明上一次還再說要擴展要兼容的。 自己去完成一些springboot-start的功能實現(xiàn), 我覺得是一個很鍛煉人的方式,一是可以讓自己多去思考自己的代碼改怎么組織,再一個是springboot-start一般都是抽出一些公共的邏輯,所以這對我們理解項目的能力也有一定的要求。springboot 存在很多的start組件,他們可以很方便的幫我們注入一些我們需要的功能,不需要的時候,直接刪除依賴就可以了,開發(fā)出來的組件 可以拔插式的接入項目。
目標
基于 AOP 實現(xiàn)系統(tǒng)監(jiān)控,主要是通過aop切面功能來增強方法,實現(xiàn)監(jiān)控。
設計
項目結構
cn-anoxia-start-log └── src ├── main │ └── java │ ├── cn.anoxia.log │ │ ├── annotation │ │ │ └── LogCheck.java │ │ ├── config │ │ │ └── LogAutoConfigure.java │ │ └── LogCheckJoinPoint.java │ └── resources │ └── META-INF │ └── spring.factories └── test └── java └── cn.anoxia.log.test └── ApiTest.java
實現(xiàn)過程主要是通過AOP攔截注解,然后對方法進行處理
- LogCheck 自定義注解,主要作用就是添加到需要監(jiān)控的方法上。
- LogAutoConfigure 配置類,對一些類做初始化操作。
- LogCheckJoinPoint 核心類,負責對攔截的方法做邏輯處理。
- spring.factories spring-boot 自動注入的配置文件。
springboot 在啟動的時候 讀取spring.factories
里面的內容,然后把配置類添加到spring容器中。 使用 springboot的自動注入的功能完成配置的加載。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.anoxia.log.config.LogAutoConfigure
自定義攔截注解LogCheck
/** * @description: 方法耗時檢測注解 * @author:huangle * @date: 2022/7/22 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) public @interface LogCheck { String key() default ""; String desc() default ""; }
AOP 處理類, 定義切點為 注解,然后使用 環(huán)繞處理 對方法進行增強。
/** * @description: aop攔截注解,進行方法增強 * @author:huangle * @date: 2022/7/22 */ @Aspect @Component public class LogCheckJoinPoint { private final Logger logger = LoggerFactory.getLogger(LogCheckJoinPoint.class); @Pointcut("@annotation(cn.anoxia.log.annotation.LogCheck)") public void aopPoint(){ // 定義切點 } @Around("aopPoint() && @annotation(logCheck)") public void doCheck(ProceedingJoinPoint joinPoint, LogCheck logCheck) throws Throwable { // 執(zhí)行前增強 logger.info("當前執(zhí)行的類:{}",joinPoint.getClass()); Method method = getMethod(joinPoint); Long start = System.currentTimeMillis(); try { // 執(zhí)行目標方法 joinPoint.proceed(); }finally { System.out.println("監(jiān)控 - Begin By AOP"); System.out.println("監(jiān)控索引:" + logCheck.key()); System.out.println("監(jiān)控描述:" + logCheck.desc()); System.out.println("方法名稱:" + method.getName()); System.out.println("方法耗時:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("監(jiān)控 - End\r\n"); } } private Method getMethod(JoinPoint jp) throws NoSuchMethodException { Signature sig = jp.getSignature(); MethodSignature methodSignature = (MethodSignature) sig; return jp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes()); } }
配置類里面的內容, 對核心類進行初始化,并且添加到spring容器
@Configuration public class LogAutoConfigure implements EnvironmentAware { private final Logger logger = LoggerFactory.getLogger(LogAutoConfigure.class); private final Map<String,Object> logConfigMap = new HashMap<>(); @Bean @ConditionalOnMissingBean public LogCheckJoinPoint point(){ return new LogCheckJoinPoint(); } }
測試
創(chuàng)建一個項目,然后導入我們創(chuàng)建的start
<dependency> <groupId>cn.anoxia</groupId> <artifactId>anoxia-spring-start-log</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>
添加注解,攔截方法
@LogCheck(key = "cn.anoxia.demo.controller.TestController",desc = "獲取用戶信息") @RequestMapping("/v1/info") public String testController(){ return "hello"; }
測試結果,可以獲取到執(zhí)行方法的一些信息,并且對方法進行增強。
總結
在我們開發(fā)組件的時候,主要是添加一個配置文件 spring.factories
讓spring-boot在啟動的時候,把我們添加的類注入進去,然后直接就在項目中使用。
以上就是SpringBoot-Start組件開發(fā)之記錄接口日志信息的詳細內容,更多關于SpringBoot-Start組件開發(fā)之記錄接口日志信息的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案
這篇文章主要介紹了SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java實現(xiàn)矩陣乘法以及優(yōu)化的方法實例
這篇文章主要給大家介紹了關于Java實現(xiàn)矩陣乘法以及優(yōu)化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02Spring Boot 之HelloWorld開發(fā)案例
這篇文章主要介紹了Spring Boot 之HelloWorld開發(fā)案例,需要的朋友可以參考下2017-04-04Apache Commons Math3探索之快速傅立葉變換代碼示例
這篇文章主要介紹了Apache Commons Math3探索之快速傅立葉變換代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-10-10SpringBoot?使用AOP?+?Redis?防止表單重復提交的方法
Spring?Boot是一個用于構建Web應用程序的框架,通過AOP可以實現(xiàn)防止表單重復提交,本文介紹了在Spring?Boot應用程序中使用AOP和Redis來防止表單重復提交的方法,需要的朋友可以參考下2023-04-04Java利用ElasticSearch實現(xiàn)自動補全功能
這篇文章主要為大家詳細介紹了Java如何利用ElasticSearch實現(xiàn)跟谷歌和百度類似的下拉補全提示功能,文中的示例代碼講解詳細,需要的可以參考一下2023-08-08BeanFactory和FactoryBean的區(qū)別示例詳解
這篇文章主要為大家介紹了BeanFactory和FactoryBean的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10