日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

如何替換重構依賴里面的Service

作者:抓蛙師 更新時間: 2022-07-10 編程語言

如何替換重構依賴里面的Service

    • 以下知識來源于瘋狂的獅子Li在QQ群的講解,純屬做一下筆記。
    • 總結的經驗

以下知識來源于瘋狂的獅子Li在QQ群的講解,純屬做一下筆記。

由于knife4j停止更新,未來將無法適配springboot3.0,所以Li研究springdoc配合apifox替換掉knife4j,
在過程中,發現控制器的名稱和描述還是需要通過增加注解@Tag(name = “xxx處理”, description = “xxx描述”)才能顯示,為了徹底去除注解,實現0侵入的api文檔方案,遂需要對springdoc進行相應的改造。

在SwaggerConfig中
增加了如下代碼

 /**
     * 自定義 openapi 處理器
     */
    @Bean
    public OpenAPIService openApiBuilder(Optional<OpenAPI> openAPI,
                                         SecurityService securityParser,
                                         SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
                                         Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers,
                                         Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomisers, Optional<JavadocProvider> javadocProvider) {
        return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider);
    }

然后聲明了OpenApiHandler extends OpenAPIService來重構OpenAPIService,為什么可以如此重構呢?首先在右側maven管理中,找到springdoc所在的包ruoyi-common,全部選中,并下載源碼。
下載springdoc源碼
然后點擊OpenAPIService進入了public class OpenAPIService implements ApplicationContextAware,
再點擊OpenAPIService,即可彈窗看到調用了此服務的相關類,
查看調用的相關類
在里面找到new OpenAPIService的地方,點擊進去。就可以看到如下方法
生成OpenAPIService的關鍵方法
可以看到,此方法有三個注解:
@Bean
@ConditionalOnMissingBean
@Lazy(false)
其中,
@Bean表示方法產生一個由Spring管理的bean,
@ConditionalOnMissingBean,它是修飾bean的一個注解,主要實現的是,當你的bean被注冊之后,如果而注冊相同類型的bean,就不會成功,它會保證你的bean只有一個,即你的實例只有一個,當你注冊多個相同的bean時,會出現異常,以此來告訴人員。
@Lazy(false)SpringIoC容器會在啟動的時候實例化所有單實例 bean 。如果我們想要實現 Spring 在啟動的時候延遲加載 bean,即在首次調用bean的時候再去執行初始化,就可以使用 @Lazy 注解來解決這個問題。而加了(false)說明沒有使用懶加載

關鍵的地方就在于@ConditionalOnMissingBean,說明可以通過自己注冊一個Bean來替換掉這個方法,因此才有了開始的在SwaggerConfig中增加的那段代碼。
如果源碼中沒有@ConditionalOnMissingBean,我們還可以直接在開頭那段代碼增加一個注解:@Primary(強制替換),也能達到目的。繼而可以在OpenApiHandler 覆寫相關方法。OpenApiHandler 中模仿OpenAPIService的結構,并找到讀取控制器@Tag部分的代碼,轉為讀取注釋來達到無需寫@Tag注解的目的。

總結的經驗

多讀spring源碼,讀源碼前,先學習設計模式,多看別人分析源碼的文章,然后自己在maven管理中,下載源碼下載源碼
譬如要找到注解的切面方法,就通過下載源碼后,點擊注解,找到xxx.class.getName() 就可以找到切面實現進而分析注解的作用。

原文鏈接:https://blog.csdn.net/leoisaking/article/details/125687251

欄目分類
最近更新