網(wǎng)站首頁 編程語言 正文
如何替換重構(gòu)依賴?yán)锩娴腟ervice
- 以下知識來源于瘋狂的獅子Li在QQ群的講解,純屬做一下筆記。
- 總結(jié)的經(jīng)驗(yàn)
以下知識來源于瘋狂的獅子Li在QQ群的講解,純屬做一下筆記。
由于knife4j停止更新,未來將無法適配springboot3.0,所以Li研究springdoc配合apifox替換掉knife4j,
在過程中,發(fā)現(xiàn)控制器的名稱和描述還是需要通過增加注解@Tag(name = “xxx處理”, description = “xxx描述”)才能顯示,為了徹底去除注解,實(shí)現(xiàn)0侵入的api文檔方案,遂需要對springdoc進(jìn)行相應(yīng)的改造。
在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來重構(gòu)OpenAPIService,為什么可以如此重構(gòu)呢?首先在右側(cè)maven管理中,找到springdoc所在的包ruoyi-common,全部選中,并下載源碼。
然后點(diǎn)擊OpenAPIService進(jìn)入了public class OpenAPIService implements ApplicationContextAware,
再點(diǎn)擊OpenAPIService,即可彈窗看到調(diào)用了此服務(wù)的相關(guān)類,
在里面找到new OpenAPIService的地方,點(diǎn)擊進(jìn)去。就可以看到如下方法
可以看到,此方法有三個注解:
@Bean
@ConditionalOnMissingBean
@Lazy(false)
其中,
@Bean表示方法產(chǎn)生一個由Spring管理的bean,
@ConditionalOnMissingBean,它是修飾bean的一個注解,主要實(shí)現(xiàn)的是,當(dāng)你的bean被注冊之后,如果而注冊相同類型的bean,就不會成功,它會保證你的bean只有一個,即你的實(shí)例只有一個,當(dāng)你注冊多個相同的bean時,會出現(xiàn)異常,以此來告訴人員。
@Lazy(false)SpringIoC容器會在啟動的時候?qū)嵗袉螌?shí)例 bean 。如果我們想要實(shí)現(xiàn) Spring 在啟動的時候延遲加載 bean,即在首次調(diào)用bean的時候再去執(zhí)行初始化,就可以使用 @Lazy 注解來解決這個問題。而加了(false)說明沒有使用懶加載
關(guān)鍵的地方就在于@ConditionalOnMissingBean,說明可以通過自己注冊一個Bean來替換掉這個方法,因此才有了開始的在SwaggerConfig中增加的那段代碼。
如果源碼中沒有@ConditionalOnMissingBean,我們還可以直接在開頭那段代碼增加一個注解:@Primary(強(qiáng)制替換),也能達(dá)到目的。繼而可以在OpenApiHandler 覆寫相關(guān)方法。OpenApiHandler 中模仿OpenAPIService的結(jié)構(gòu),并找到讀取控制器@Tag部分的代碼,轉(zhuǎn)為讀取注釋來達(dá)到無需寫@Tag注解的目的。
總結(jié)的經(jīng)驗(yàn)
多讀spring源碼,讀源碼前,先學(xué)習(xí)設(shè)計(jì)模式,多看別人分析源碼的文章,然后自己在maven管理中,下載源碼
譬如要找到注解的切面方法,就通過下載源碼后,點(diǎn)擊注解,找到xxx.class.getName() 就可以找到切面實(shí)現(xiàn)進(jìn)而分析注解的作用。
原文鏈接:https://blog.csdn.net/leoisaking/article/details/125687251
相關(guān)推薦
- 2022-06-09 Python字符串的索引與切片_python
- 2023-05-29 Postgresql數(shù)據(jù)庫角色創(chuàng)建登錄詳解_PostgreSQL
- 2022-05-19 pytorch中的?.view()函數(shù)的用法介紹_python
- 2022-12-22 Python?Flask框架實(shí)現(xiàn)Proteus仿真Arduino與網(wǎng)頁數(shù)據(jù)交互_python
- 2022-10-14 分布式系統(tǒng)Redis解決Session共享問題
- 2022-07-15 python向量化與for循環(huán)耗時對比分析_python
- 2022-08-27 C#使用百度Ueditor富文本框?qū)崿F(xiàn)上傳文件_C#教程
- 2024-01-30 深入理解Scrapy中XPath的`following-sibling`選擇器
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支