網站首頁 編程語言 正文
如何替換重構依賴里面的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,全部選中,并下載源碼。
然后點擊OpenAPIService進入了public class OpenAPIService implements ApplicationContextAware,
再點擊OpenAPIService,即可彈窗看到調用了此服務的相關類,
在里面找到new 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
相關推薦
- 2023-03-20 C#?獲取XML文件內容的多種方式總結_C#教程
- 2022-07-22 Python ModuleNotFoundError: No module named通俗的解釋和方
- 2022-05-24 python中對列表的相關操作你知道嗎_python
- 2023-06-18 C#Process的OutputDataReceived事件不觸發問題及解決_C#教程
- 2022-05-29 react實現可播放的進度條_React
- 2023-10-27 react調用MATERIAL-UI的組件中使用componentWillReceiveProps或
- 2023-06-21 Docker安裝部署Redis數據庫的實現步驟_docker
- 2022-09-20 C#先判斷是否存在再創建文件夾或文件與遞歸計算文件夾大小_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支