詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息
前言
不積跬步無以至千里,不積小流,無以成江海
在公司一般來說,都只會(huì)接觸一些CRUD的業(yè)務(wù),很多時(shí)候可能你想設(shè)計(jì)很多的代碼結(jié)構(gòu),但是時(shí)間不允許。近期接到一個(gè)項(xiàng)目,領(lǐng)導(dǎo)說要擴(kuò)展、要兼容、等等等。然后我就想著那我就花點(diǎn)時(shí)間把代碼結(jié)構(gòu)設(shè)計(jì)一下,然后給出排期,當(dāng)領(lǐng)導(dǎo)看到我的排期時(shí)間的時(shí)候,他跟我說,我們要小步快跑,我覺得他在CPU我,明明上一次還再說要擴(kuò)展要兼容的。 自己去完成一些springboot-start的功能實(shí)現(xiàn), 我覺得是一個(gè)很鍛煉人的方式,一是可以讓自己多去思考自己的代碼改怎么組織,再一個(gè)是springboot-start一般都是抽出一些公共的邏輯,所以這對(duì)我們理解項(xiàng)目的能力也有一定的要求。springboot 存在很多的start組件,他們可以很方便的幫我們注入一些我們需要的功能,不需要的時(shí)候,直接刪除依賴就可以了,開發(fā)出來的組件 可以拔插式的接入項(xiàng)目。
目標(biāo)
基于 AOP 實(shí)現(xiàn)系統(tǒng)監(jiān)控,主要是通過aop切面功能來增強(qiáng)方法,實(shí)現(xiàn)監(jiān)控。
設(shè)計(jì)
項(xiàng)目結(jié)構(gòu)
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實(shí)現(xiàn)過程主要是通過AOP攔截注解,然后對(duì)方法進(jìn)行處理
- LogCheck 自定義注解,主要作用就是添加到需要監(jiān)控的方法上。
- LogAutoConfigure 配置類,對(duì)一些類做初始化操作。
- LogCheckJoinPoint 核心類,負(fù)責(zé)對(duì)攔截的方法做邏輯處理。
- spring.factories spring-boot 自動(dòng)注入的配置文件。
springboot 在啟動(dòng)的時(shí)候 讀取spring.factories里面的內(nèi)容,然后把配置類添加到spring容器中。 使用 springboot的自動(dòng)注入的功能完成配置的加載。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.anoxia.log.config.LogAutoConfigure
自定義攔截注解LogCheck
/**
* @description: 方法耗時(shí)檢測注解
* @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 處理類, 定義切點(diǎn)為 注解,然后使用 環(huán)繞處理 對(duì)方法進(jìn)行增強(qiáng)。
/**
* @description: aop攔截注解,進(jìn)行方法增強(qiáng)
* @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(){
// 定義切點(diǎn)
}
@Around("aopPoint() && @annotation(logCheck)")
public void doCheck(ProceedingJoinPoint joinPoint, LogCheck logCheck) throws Throwable {
// 執(zhí)行前增強(qiáng)
logger.info("當(dāng)前執(zhí)行的類:{}",joinPoint.getClass());
Method method = getMethod(joinPoint);
Long start = System.currentTimeMillis();
try {
// 執(zhí)行目標(biāo)方法
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("方法耗時(shí):" + (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());
}
}配置類里面的內(nèi)容, 對(duì)核心類進(jìn)行初始化,并且添加到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)建一個(gè)項(xiàng)目,然后導(dǎo)入我們創(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";
}
測試結(jié)果,可以獲取到執(zhí)行方法的一些信息,并且對(duì)方法進(jìn)行增強(qiáng)。

總結(jié)
在我們開發(fā)組件的時(shí)候,主要是添加一個(gè)配置文件 spring.factories讓spring-boot在啟動(dòng)的時(shí)候,把我們添加的類注入進(jìn)去,然后直接就在項(xiàng)目中使用。
以上就是SpringBoot-Start組件開發(fā)之記錄接口日志信息的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot-Start組件開發(fā)之記錄接口日志信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
全面詳解java代碼重構(gòu)與設(shè)計(jì)模式
這篇文章主要為大家介紹了全面詳解java代碼重構(gòu)與設(shè)計(jì)模式的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Java實(shí)現(xiàn)分頁的前臺(tái)頁面和后臺(tái)代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分頁的前臺(tái)頁面和后臺(tái)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
java string 轉(zhuǎn)date方法如何實(shí)現(xiàn)
在開發(fā)應(yīng)用中經(jīng)常會(huì)使用到j(luò)ava string 轉(zhuǎn)date這種不是很常見的做法,本文將以此問題提供詳細(xì)解決方案,需要了解的朋友可以參考下2012-11-11
Java多線程使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解
這篇文章主要介紹了Java多線程使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解,主要講解阻塞隊(duì)列的特性、實(shí)際開發(fā)中常用的到的生產(chǎn)者消費(fèi)者模型,以及生產(chǎn)者消費(fèi)者模型解耦合、削峰填谷的好處,需要的朋友可以參考下2023-07-07
使用SpringBoot實(shí)現(xiàn)微服務(wù)超時(shí)重試模式的示例
這篇文章主要介紹了使用SpringBoot實(shí)現(xiàn)微服務(wù)超時(shí)重試模式的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11
Windows下使用Graalvm將Springboot應(yīng)用編譯成exe大大提高啟動(dòng)和運(yùn)行效率(推薦)
這篇文章主要介紹了Windows下使用Graalvm將Springboot應(yīng)用編譯成exe大大提高啟動(dòng)和運(yùn)行效率,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Spring Boot 2.0 配置屬性自定義轉(zhuǎn)換的方法
這篇文章主要介紹了Spring Boot 2.0 配置屬性自定義轉(zhuǎn)換的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11

