欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解SpringBoot?Start組件開(kāi)發(fā)之記錄接口日志信息

 更新時(shí)間:2023年04月28日 10:00:18   作者:Anoxia1  
這篇文章主要為大家介紹了SpringBoot-Start組件開(kāi)發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

不積跬步無(wú)以至千里,不積小流,無(wú)以成江海

在公司一般來(lái)說(shuō),都只會(huì)接觸一些CRUD的業(yè)務(wù),很多時(shí)候可能你想設(shè)計(jì)很多的代碼結(jié)構(gòu),但是時(shí)間不允許。近期接到一個(gè)項(xiàng)目,領(lǐng)導(dǎo)說(shuō)要擴(kuò)展、要兼容、等等等。然后我就想著那我就花點(diǎn)時(shí)間把代碼結(jié)構(gòu)設(shè)計(jì)一下,然后給出排期,當(dāng)領(lǐng)導(dǎo)看到我的排期時(shí)間的時(shí)候,他跟我說(shuō),我們要小步快跑,我覺(jué)得他在CPU我,明明上一次還再說(shuō)要擴(kuò)展要兼容的。 自己去完成一些springboot-start的功能實(shí)現(xiàn), 我覺(jué)得是一個(gè)很鍛煉人的方式,一是可以讓自己多去思考自己的代碼改怎么組織,再一個(gè)是springboot-start一般都是抽出一些公共的邏輯,所以這對(duì)我們理解項(xiàng)目的能力也有一定的要求。springboot 存在很多的start組件,他們可以很方便的幫我們注入一些我們需要的功能,不需要的時(shí)候,直接刪除依賴(lài)就可以了,開(kāi)發(fā)出來(lái)的組件 可以拔插式的接入項(xiàng)目。

目標(biāo)

基于 AOP 實(shí)現(xiàn)系統(tǒng)監(jiān)控,主要是通過(guò)aop切面功能來(lái)增強(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)過(guò)程主要是通過(guò)AOP攔截注解,然后對(duì)方法進(jìn)行處理

  • LogCheck 自定義注解,主要作用就是添加到需要監(jiān)控的方法上。
  • LogAutoConfigure 配置類(lèi),對(duì)一些類(lèi)做初始化操作。
  • LogCheckJoinPoint 核心類(lèi),負(fù)責(zé)對(duì)攔截的方法做邏輯處理。
  • spring.factories spring-boot 自動(dòng)注入的配置文件。

springboot 在啟動(dòng)的時(shí)候 讀取spring.factories里面的內(nèi)容,然后把配置類(lèi)添加到spring容器中。 使用 springboot的自動(dòng)注入的功能完成配置的加載。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.anoxia.log.config.LogAutoConfigure

自定義攔截注解LogCheck

/**
 * @description: 方法耗時(shí)檢測(cè)注解
 * @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 處理類(lèi), 定義切點(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í)行的類(lèi):{}",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("方法名稱(chēng):" + 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());
    }
}

配置類(lèi)里面的內(nèi)容, 對(duì)核心類(lèi)進(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();
    }
}

測(cè)試

創(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 = "獲取用戶(hù)信息")
    @RequestMapping("/v1/info")
    public String testController(){
        return "hello";
    }

測(cè)試結(jié)果,可以獲取到執(zhí)行方法的一些信息,并且對(duì)方法進(jìn)行增強(qiáng)。

總結(jié)

在我們開(kāi)發(fā)組件的時(shí)候,主要是添加一個(gè)配置文件 spring.factories讓spring-boot在啟動(dòng)的時(shí)候,把我們添加的類(lèi)注入進(jìn)去,然后直接就在項(xiàng)目中使用。

以上就是SpringBoot-Start組件開(kāi)發(fā)之記錄接口日志信息的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot-Start組件開(kāi)發(fā)之記錄接口日志信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java Synchronized的使用詳解

    Java Synchronized的使用詳解

    這篇文章主要介紹了Java Synchronized的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • JDBC使用Statement修改數(shù)據(jù)庫(kù)

    JDBC使用Statement修改數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了JDBC使用Statement修改數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • SpringBoot項(xiàng)目 文件上傳臨時(shí)目標(biāo)被刪除異常的處理方案

    SpringBoot項(xiàng)目 文件上傳臨時(shí)目標(biāo)被刪除異常的處理方案

    這篇文章主要介紹了SpringBoot項(xiàng)目 文件上傳臨時(shí)目標(biāo)被刪除異常的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java SQL注入案例教程及html基礎(chǔ)入門(mén)

    Java SQL注入案例教程及html基礎(chǔ)入門(mén)

    這篇文章主要介紹了前端開(kāi)發(fā)每天必學(xué)之SQL及HTML入門(mén)基礎(chǔ)知識(shí),介紹了學(xué)習(xí)web前端開(kāi)發(fā)需要掌握的基礎(chǔ)技術(shù),感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Spring Boot 之HelloWorld開(kāi)發(fā)案例

    Spring Boot 之HelloWorld開(kāi)發(fā)案例

    這篇文章主要介紹了Spring Boot 之HelloWorld開(kāi)發(fā)案例,需要的朋友可以參考下
    2017-04-04
  • Apache Commons Math3探索之快速傅立葉變換代碼示例

    Apache Commons Math3探索之快速傅立葉變換代碼示例

    這篇文章主要介紹了Apache Commons Math3探索之快速傅立葉變換代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法

    SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法

    Spring?Boot是一個(gè)用于構(gòu)建Web應(yīng)用程序的框架,通過(guò)AOP可以實(shí)現(xiàn)防止表單重復(fù)提交,本文介紹了在Spring?Boot應(yīng)用程序中使用AOP和Redis來(lái)防止表單重復(fù)提交的方法,需要的朋友可以參考下
    2023-04-04
  • Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能

    Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能

    這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch實(shí)現(xiàn)跟谷歌和百度類(lèi)似的下拉補(bǔ)全提示功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-08-08
  • BeanFactory和FactoryBean的區(qū)別示例詳解

    BeanFactory和FactoryBean的區(qū)別示例詳解

    這篇文章主要為大家介紹了BeanFactory和FactoryBean的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論