Spring Boot自定義Starter:從原理到實戰全解析

1. 背景與需求

1.1 什么是Starter? Spring Boot的起步依賴(Starter)是一種特殊的依賴描述符,用于簡化Spring應用的依賴管理和自動配置。官方文檔將Starter定義為“一組方便的依賴描述符”,開發者只需引入對應的Starter,就能“一站式”獲得所需的Spring技術棧和默認配置。例如,spring-boot-starter-web包含了Spring MVC、Jackson等常用庫,并在啟動時自動完成相關配置,使開發者無需逐個添加依賴或手動編寫冗長配置。

1.2 為什么需要自定義Starter? 在企業級開發中,往往存在一些跨項目復用的通用功能(如日志攔截、權限校驗、消息通知等),如果在每個項目中單獨實現,不僅代碼重復,維護成本也高。自定義Starter可以將這些公共功能、依賴和配置封裝成一個可復用的模塊,提高代碼重用性配置一致性。例如,通過自定義Starter,可以統一項目的外部依賴和默認行為,開發者只需簡單地引入Starter即可獲得完整功能。正如實踐中所示,自定義Starter的主要優勢包括模塊化設計、配置簡化快速集成等。舉例來說,一個團隊在多個微服務中都需要短信驗證碼發送功能,此時創建一個短信服務Starter就能避免在每個微服務中重復編碼,只需在項目中添加依賴即可開箱即用。

1.3 典型應用場景。 自定義Starter最常見的應用場景包括:

  • 企業通用功能封裝:如短信/郵件通知、緩存封裝、數據庫讀寫分離等。通過Starter把這些功能在各項目間共享。

  • 業務中間件集成:例如消息隊列(RabbitMQ、Kafka)、分布式ID生成、日志攔截(AOP切面)等邏輯可封裝為Starter。

  • 權限及安全模塊:統一的鑒權、訪問控制或安全策略也可以打包為Starter,保證各系統的一致性。

  • 微服務公共組件:例如全局異常處理、監控攔截器、統一配置客戶端等。Spring Boot官方及社區提供的許多Starter(如Web、JPA、Cloud Config等)也正是基于這些需求而設計。

綜上,自定義Starter通過約定大于配置的理念,為團隊提供了便利——只需添加依賴即可獲得完整功能配置,極大提升開發效率。

2. 核心原理

2.1 Spring Boot自動裝配機制解析。 Spring Boot的自動裝配機制(Auto-Configuration)是Starter能夠開箱即用的基礎。其實現原理是:Spring Boot在啟動時通過SpringFactoriesLoader掃描所有Jar包下的META-INF/spring.factories(或新版本中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports),將其中列出的自動配置類(@Configuration)加載到應用上下文中。這些自動配置類一般帶有各種@Conditional注解(如@ConditionalOnClass@ConditionalOnMissingBean等),用于在特定條件下動態注冊Bean。例如,Spring Boot常在自動配置類上使用@ConditionalOnClass檢查類路徑中是否存在相關庫,如果存在才啟用該自動配置;而@ConditionalOnMissingBean則保證在用戶未自定義相同Bean時才注冊默認Bean。這種基于條件的加載確保了自動配置的靈活性和安全性,避免與業務代碼發生沖突。

在啟動階段,SpringApplication.run()會觸發自動裝配流程:Spring Boot首先創建一個應用上下文,然后調用SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration, classLoader)讀取所有自動配置類的全限定名,依次加載這些配置類并解析@Conditional注解。只有當所有條件都滿足時,自動配置類中的@Bean方法才會被執行,相關Bean才會注入到容器。這一機制使得我們無需手動實例化對象或顯式配置,Starter所提供的組件即可被自動發現并注入到應用中。

2.2 spring.factoriesAutoConfiguration.imports的演進。 早期Spring Boot(2.x以前)使用META-INF/spring.factories文件來注冊自動配置類:在該文件中以org.springframework.boot.autoconfigure.EnableAutoConfiguration鍵列出所有自動配置類。例如:

# spring.factories示例(Spring Boot 2.x)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.CustomAutoConfiguration,\
com.example.starter.CustomWebAutoConfiguration

Spring Boot啟動時會自動加載這些類。自Spring Boot 2.7起,引入了新的注冊機制,允許在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中列出自動配置類,同時仍對舊方式提供兼容。而在Spring Boot 3.0及以上版本中,官方已移除通過spring.factories注冊自動配置的支持,僅推薦使用AutoConfiguration.imports文件。新文件路徑為:

src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

內容就是自動配置類的全限定名列表。這樣做可以簡化配置文件的格式,并避免spring.factories文件過度臃腫。因此,自定義Starter在支持Spring Boot 3.x時,應使用AutoConfiguration.imports;若需要兼容Spring Boot 2.x,建議同時保留spring.factories配置。

2.3 條件化配置注解的底層實現。 Spring Boot提供了豐富的條件注解(@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty@ConditionalOnResource等),用于控制自動配置類或Bean的加載與否。這些注解本質上都是基于Spring核心的@Conditional機制實現的:Spring在解析配置類時,會調用對應的Condition接口邏輯來判斷條件是否成立。例如,@ConditionalOnClass會檢查指定的類是否存在于類路徑中;其底層通過Spring的注解元數據解析器(基于ASM技術)讀取注解屬性,從而在不實際加載類的情況下判斷類是否可用。而@ConditionalOnProperty則根據Environment中的配置屬性值來決定加載,這使得我們可以通過配置文件動態打開或關閉某些Starter功能。再如,@ConditionalOnMissingBean會在容器中查找指定類型的Bean,只有找不到時才創建默認Bean,從而允許用戶自定義Bean來覆蓋自動配置。通過這些條件注解的疊加使用,自動裝配機制能夠智能地對環境進行自適應,大幅簡化配置和避免沖突。這些實現細節藏在Spring Boot的自動配置源碼中(如org.springframework.boot.autoconfigure.condition包),但對使用者來說,只需理解其使用場景即可編寫靈活的Starter。

3. 自定義Starter開發步驟

下面我們通過一個示例來演示自定義Starter的全流程。假設要開發一個“hello-starter”,它提供一個HelloService,通過配置文件可定制歡迎消息。

3.1 創建Maven項目并引入依賴

首先,新建一個Maven項目作為Starter的主體。建議項目<artifactId>以功能名加后綴-spring-boot-starter命名,例如hello-spring-boot-starter。在pom.xml中,引入Spring Boot自動裝配相關依賴,例如:

<project ...><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>hello-spring-boot-starter</artifactId><version>1.0.0</version><!-- 父POM使用Spring Boot Starter Parent --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version></parent><dependencies><!-- 引入自動配置支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- 可選:引入配置元數據生成器,幫助IDE對@ConfigurationProperties提供自動補全(可標記為optional) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies>
</project>

說明: spring-boot-autoconfigure 依賴讓Starter能掛鉤到自動裝配體系;spring-boot-configuration-processor 用于在編譯期生成配置屬性提示元數據,開發者在使用時可獲得IDE的自動提示。請根據實際需求選擇Spring Boot版本,若需要支持Spring Boot 3.x,可將父POM版本設置為3.x

3.2 編寫自動配置類與屬性綁定類

自動配置類示例: 在代碼中創建一個配置類,例如HelloServiceAutoConfiguration,用于注冊Starter提供的Bean。示例代碼:

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic HelloService helloService(HelloProperties props) {// 使用配置屬性初始化Servicereturn new HelloService(props.getMsg());}
}

其中:

  • @Configuration聲明這是一個配置類。

  • @EnableConfigurationProperties(HelloProperties.class)啟用屬性綁定,Spring Boot會將帶@ConfigurationProperties注解的HelloProperties加載為Bean,并從配置文件中將前綴hello的屬性注入到該對象中。

  • @ConditionalOnClass(HelloService.class)表示只有當類路徑中存在HelloService時才啟用此自動配置,避免所需依賴缺失導致異常。

  • @Bean @ConditionalOnMissingBean表示注冊HelloService Bean且僅當容器中尚未存在同名或同類型的Bean時才生效,允許用戶自行覆蓋默認實現。

  • 方法內部通過HelloProperties獲取外部配置的值,為HelloService實例提供定制化參數。

配置屬性類示例: 創建一個用于綁定配置的Java類,例如:

@ConfigurationProperties(prefix = "hello")
public class HelloProperties {private String msg = "Hello, World!";// getter & setter
}

@ConfigurationProperties(prefix="hello")注解將匹配配置文件中以hello開頭的屬性,將其映射到類的字段上。例如,如果在application.yml中寫入:

hello:msg: "你好,世界!"

HelloPropertiesmsg字段會被注入為“你好,世界!”。spring-boot-configuration-processor依賴會在編譯時為此類生成元數據文件,IDE會根據prefix給出智能提示。以上步驟完成后,我們的自動配置類就能自動讀取并使用外部配置值。

3.3 配置spring.factoriesAutoConfiguration.imports

為了讓Spring Boot應用掃描到我們的自動配置類,需要在src/main/resources下創建元數據文件:

  • 對于Spring Boot 2.x(尤其是2.6及以前)版本,在META-INF/spring.factories中添加:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.example.hello.HelloServiceAutoConfiguration
    

    ?

  • 對于Spring Boot 2.7+ / 3.x版本,應在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中列出自動配置類:

    com.example.hello.HelloServiceAutoConfiguration
    

使用AutoConfiguration.imports文件的方式是Spring Boot新版本的要求。前者方式在3.0后已不再支持,但若需要兼容,建議同時維護兩個文件。Spring Boot啟動時會讀取這些文件,發現并加載列出的配置類。

3.4 打包與發布Starter

完成代碼后,可以使用Maven將Starter打包為JAR。執行 mvn clean install 會編譯并將JAR安裝到本地Maven倉庫(~/.m2/repository)。完成安裝后,其他項目即可通過添加依賴的方式引入Starter:

<dependency><groupId>com.example</groupId><artifactId>hello-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>

如果希望團隊成員或CI環境都能獲取該Starter,應將其發布到遠程倉庫(如私有的Nexus/Artifactory)。在pom.xml中配置<distributionManagement>指向倉庫地址,并執行mvn deploy即可將構建產物上傳。同理,若希望公開發布到Maven Central,還需要按Sonatype要求添加簽名等配置(略)。總之,發布過程與普通Maven項目一致,將生成的JAR交給目標倉庫管理即可供其他項目消費。

4. 源碼解析

4.1 SpringApplication啟動過程中的自動配置加載。 Spring Boot應用啟動時,SpringApplication會創建并刷新ApplicationContext,期間會通過SpringFactoriesLoader加載自動配置類。具體來看,Spring Boot會使用EnableAutoConfiguration作為key,從所有依賴的JAR包中查找spring.factoriesAutoConfiguration.imports文件。然后將每個自動配置類按需注冊到上下文。當條件均滿足時,自動配置類中的@Bean方法會被調用,生成對應的Bean并加入到容器。這一過程在官方文檔中總結為:“Spring Boot在啟動時從AutoConfiguration.imports(或舊版的spring.factories)中發現自動配置類,校驗各個條件后,將相應的Bean裝配到應用上下文中。”換言之,自定義Starter的自動配置類一旦正確注冊,就如同Spring容器自帶的Bean一樣被自動加載,沒有任何額外手動干預。

4.2 @ConfigurationProperties綁定配置的實現原理。 Spring Boot通過@ConfigurationProperties和相關后置處理器實現了配置與Java對象的綁定。當在自動配置類上使用@EnableConfigurationProperties(HelloProperties.class)時,Spring Boot會將HelloProperties注冊為一個Bean。啟動時,ConfigurationPropertiesBindingPostProcessor會掃描環境(Environment)中的屬性,將hello.*前綴的配置注入到HelloProperties實例中。這一機制依賴于Spring對注解元數據的處理,背后使用了Binder或松耦合的元數據解析器,將標準的application.yml/properties映射到對象字段。例如,前述示例中hello.msg=…就會自動賦值給HelloProperties.msg。如果配置格式錯誤或前綴不匹配,則注入會失敗,此時Spring會在啟動時拋出異常并提示配置問題。因此,在設計Starter時要確保prefix設置正確,并在需要時通過配置處理器生成元數據(以提供提示)。

4.3 條件化注解的源碼分析。 Spring Boot的條件注解實際是由Spring核心的@Conditional支持的。當應用上下文解析@Configuration類時,Spring會調用對應的Condition邏輯。以@ConditionalOnClass為例,它的底層實現會檢查指定類是否存在于類路徑中;其注解元數據可以直接使用類名字符串,由Spring使用ASM庫解析即可。如果條件不滿足,則Spring會跳過該配置類或Bean的加載。類似地,@ConditionalOnMissingBean通過檢查容器中的Bean定義來決定是否注冊新Bean。@ConditionalOnProperty則讀取Environment的屬性值,與指定條件比較。Spring Boot還提供了更多復雜條件(如Web應用存在與否、特定資源文件存在與否等),都依賴于Spring的條件機制。開發者在編寫自動配置時,可自由組合這些注解,從而精確控制Starter的激活時機。例如,可以使用@ConditionalOnProperty來實現按需啟用,只有在配置文件開啟開關時才加載相關Bean。總體而言,條件注解的實現邏輯分散在Spring Boot源碼(org.springframework.boot.autoconfigure.condition包)中,但使用時只要注重含義即可。

5. 使用示例

假設已經將自定義Starter發布成功,下面演示在一個Spring Boot應用中引入并驗證該Starter功能。

5.1 引入自定義Starter。 在目標項目的pom.xml中添加Starter依賴:

<dependency><groupId>com.example</groupId><artifactId>hello-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>

然后在應用主類或任意@SpringBootApplication所在的類中,直接使用Starter提供的組件。例如,可以注入HelloService

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {@Autowiredprivate HelloService helloService;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Overridepublic void run(String... args) {System.out.println(helloService.sayHello());}
}

只要Starter和自動配置正確,Spring Boot會自動掃描并注冊HelloService Bean,無需額外配置。

5.2 通過application.yml配置自定義屬性。 假設HelloService會使用HelloProperties里的msg屬性,那么在src/main/resources/application.yml中可以配置:

hello:msg: "歡迎使用自定義Starter!"

配置完成后,重啟應用時,helloService.sayHello()將使用以上自定義消息作為輸出。類似地,如果在自動配置類中使用了@ConditionalOnProperty來控制開關,也可在此處設置開關屬性(如hello.enabled=true)來決定是否啟用該Starter。

5.3 驗證Starter功能。 運行目標應用,如果控制臺輸出了Starter中定義的歡迎消息(或觸發了日志攔截、權限校驗等功能),說明自定義Starter已正確生效。例如,在日志方面,可在自動配置中定義一個AOP切面,在配置文件中開啟時統一記錄請求日志;在權限校驗方面,可定義一個攔截器在每次請求前進行鑒權。通常,我們只需編寫Starter測試代碼或@SpringBootTest單元測試來驗證其行為即可。在實際業務中,也可以通過增加日志或調試級別(logging.level.org.springframework=DEBUG)觀察自動配置報告,以確認Starter中的組件是否已經裝配到容器。

6. 常見問題與優化

6.1 類路徑沖突的解決方案。 自定義Starter引入依賴時,可能會與項目中已有依賴產生版本沖突或重復類。如果Starter中包含了大量第三方庫,一旦這些庫版本與應用自身版本不符,可能導致類沖突或NoClassDef錯誤。為避免此類問題,最佳實踐是將可選的依賴聲明為providedoptional,即只在編譯時使用,不打包進最終Jar。例如,如果Starter中需要使用Jackson或Spring Web,可在Starter的pom.xml中將其依賴標記為<optional>true</optional><scope>provided</scope>,這樣使用Starter的應用可以自行選擇合適版本。同時,應仔細管理Spring Boot的版本兼容性,Starter的spring-boot-autoconfigure版本盡量與目標應用一致。遇到沖突時,可通過<exclusions>剔除Starter傳遞的沖突依賴,并使用spring.autoconfigure.exclude排除不需要的自動配置類。

6.2 配置加載失敗的排查方法。 如果Starter所提供的配置屬性沒有生效,常見原因包括:屬性前綴填寫錯誤、@EnableConfigurationProperties未生效或配置文件位置不正確等。排查時可先檢查application.yml/properties的格式和前綴是否與@ConfigurationProperties匹配;確保自動配置類已被正確加載(可查看控制臺輸出的自動配置報告)。開啟Spring Boot的調試模式(-Dspring-boot.run.arguments=--debug)可以查看所有自動配置類是否生效,并排查未加載的原因。此外,請確認在Spring Boot 3.x環境中是否正確使用了AutoConfiguration.imports,以及Starter的包名、類名沒有拼寫錯誤。對于更深層問題,可編寫測試類并使用@SpringBootTest,觀察應用上下文中是否包含期待的Bean。

6.3 性能優化建議。 雖然自動裝配帶來了便利,但不必要的Bean也可能影響啟動性能。可以通過優化條件加載來提升效率:

  • 按需加載:利用@ConditionalOnProperty等條件,僅在確實需要時才加載相應配置和Bean。

  • 延遲初始化:在Spring Boot 2.2及以上版本,可以設置spring.main.lazy-initialization=true,讓Bean在真正被使用時才創建,減少啟動耗時。

  • Spring Boot自定義Starter:從原理到實戰全解析控制自動配置順序:如果多個Starter存在依賴關系,可使用@AutoConfigureBefore@AutoConfigureAfter來指定加載順序,避免不必要的覆蓋或重復加載。

  • 剔除冗余依賴:Starter中不應包含過多和業務無關的依賴,盡可能精簡打包內容。參考發布打包時的建議,例如避免打包日志框架或數據庫驅動,讓應用自行管理這些通用依賴。

通過上述方法,可以讓自定義Starter在保證功能的同時,盡量減少對應用性能的影響。

7. 實際業務場景

7.1 微服務中統一異常處理模塊。 在微服務架構中,常常需要在各個服務中采用一致的異常響應格式。可以通過自定義Starter來封裝全局異常處理邏輯:例如,實現一個帶有@ControllerAdvice注解的統一異常處理類,并將其包含在Starter中。當各微服務引入該Starter后,在控制器拋出異常時,統一的@ExceptionHandler就會生效,返回標準化的錯誤響應(如特定格式的JSON)。這種方式下,開發人員無需在每個服務中手動編寫重復的異常處理代碼,只需關心業務邏輯即可,極大提升了代碼復用性和可維護性。

7.2 企業級通用工具類封裝: 許多企業級項目都需要集成短信發送、郵件通知、分布式ID生成等服務。以短信服務為例,在“自定義Starter:簡化短信服務集成”案例中,通過編寫SmsAutoConfigurationSmsProperties,開發者能實現一個「短信Starter」,在項目中引用即可簡單地通過配置調用短信接口。同理,郵件通知、支付SDK、日志上報等通用工具也可采用相同的方式打包。此類Starter封裝了與第三方系統交互的復雜細節(如API客戶端初始化、加密校驗等),讓業務開發者專注于配置參數,從而提高開發效率并保證了企業架構的一致性。

通過上述示例可見,自定義Starter使得“重復性勞動”變為可復用的模塊,在實際項目中價值非常顯著

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92591.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安寶特方案丨工業AR+AI質檢方案:致力于提升檢測精度與流程效率

據IDC預測&#xff0c;2025年中國工業AI質檢市場規模將達62億元&#xff0c;年復合增長率28.5%&#xff0c;新能源、消費電子、高端裝備三大領域貢獻超70%市場份額。這一數據印證了AI質檢已從可選技術升級為制造業降本增效的生存剛需。當前制造業質檢環節正面臨&#xff1a;精度…

AudioLLM

參考鏈接&#xff1a;https://mp.weixin.qq.com/s/cscrUn7n_o6PdeQRzWpx8g 視頻教程&#xff1a;https://www.bilibili.com/video/BV1LGbozkEDY 模型代碼&#xff1a;https://github.com/boson-ai/higgs-audio 如果是兩個模型加在一起&#xff1a;一個語言模型&#xff0c;一個…

基于 CEP 引擎的算法拆單與調度實踐—基礎篇

在金融市場中&#xff0c;大額訂單的一次性交易可能會對市場價格產生較大沖擊&#xff0c;導致交易成本增加。例如&#xff0c;大額買入訂單可能會迅速推高股價&#xff0c;使后續買入成本上升&#xff1b;大額賣出訂單則可能打壓股價&#xff0c;造成資產賤賣。拆單算法通過將…

開源 C# TCP 通信框架 SocketDJ 發布:輕量、免費、可擴展

前言市面上的網絡通信框架琳瑯滿目&#xff0c;功能強大者有之&#xff0c;但不少都存在功能閉源、商業收費、學習成本高等問題。作為一名熱愛底層技術的開發者&#xff0c;我始終相信&#xff1a;基礎通信能力應當簡單、透明且免費。最近正好有項目需求&#xff0c;索性動手從…

移動機器人路徑規劃中ROS2中間件性能的研究綜述

導讀&#xff1a; 隨著移動機器人在工業自動化、特種作業及智能服務領域的廣泛應用&#xff0c;其路徑規劃能力越來越依賴機器人操作系統ROS2的通信性能。ROS2通過去中心化架構與數據分發服務中間件顯著提升了系統可靠性&#xff0c;但動態復雜環境中路徑規劃對通信延遲、帶寬…

【昇騰】Atlas 500 A2 智能小站制卡從M.2 SATA盤啟動Ubuntu22.04系統,重新上電卡死沒進系統問題處理_20250808

一、問題背景 Atlas 500 A2智能小站是華為基于20T 12G版本的Atlas 200I A2加速模塊開發的面向廣泛邊緣應用場景的輕量邊緣設備&#xff0c;具有超強計算性能、配置靈活、體積小、支持溫度范圍寬、環境適應性強、易于維護 管理等特點的產品。Atlas 500 A2智能小站主要應用在智能…

sigaction 中 sa_handler = SIG_IGN 的深度解析與應用實踐

sigaction 中 sa_handler SIG_IGN 的深度解析與應用實踐 核心意義&#xff1a;主動忽略信號 當 sa_handler 設置為 SIG_IGN 時&#xff0c;內核將完全丟棄指定的信號&#xff0c;不會&#xff1a; 執行默認行為調用任何處理函數中斷進程的正常執行 這與 SIG_DFL&#xff08;默…

【LLM實戰|langchain、qwen_agent】RAG高級

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 0. 前言 RAG高級 1. RAG 高效召回方法 合理設置TOP-K 改進索引算法 -知識圖譜 引入重排序 重排序模型 BGE-Rerank Cohere Rerank 混合檢索 向量索引+關鍵詞索引…

C++方向知識匯總(一)

關于單例模式1.什么是單例模式&#xff1f;答&#xff1a;單例模式是一種創建型設計模式&#xff0c;確保一個類在運行期間僅有一個實例&#xff0c;提供全局唯一的訪問點2.單例模式的目的&#xff1f;答&#xff1a;避免重復創建資源消耗大的對象&#xff0c;例如日志系統、線…

學習:JS[8]本地存儲+正則表達式

一.本地存儲1.介紹將數據存儲到用戶瀏覽器當中設置、讀取方便、頁面刷新不丟失數據2.本地存儲分類-localStoragea.語法(1)存儲數據//存儲數據 localStorage.setItem(鍵,值)如 localStorage.setItem(uname,哈哈)(2)獲取數據//獲取方式 都加引號 localStorage.getItem(鍵) localS…

C++算法練習:單詞識別

做題記錄&#xff1a;牛客習題&#xff1a;單詞識別 相關題目代碼已經提交到gitee中&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com喜歡請點個贊謝謝 目錄 題目&#xff1a; C 字符函數頭文件頭文件&#xff1a;&#xff08;C 標準庫&#xff09;核心函數功能說明&#…

從免費到盈利:Coze智能體1小時封裝變現全流程指南——井云科技

在AI技術普惠的浪潮下&#xff0c;Coze等智能體平臺讓零代碼開發者也能快速構建功能強大的AI助手。然而&#xff0c;許多創作者在完成智能體開發后&#xff0c;卻面臨“工具免費、成本自擔”的困境——用戶無限制調用導致算力成本飆升&#xff0c;想收費又缺乏成熟的支付與用戶…

C++學習之STL學習:map/set

通過前面的學習&#xff0c;我們已經對C STL有了初步了解。然而&#xff0c;STL作為一個龐大復雜的體系&#xff0c;遠不止這些內容。接下來&#xff0c;我們將深入探討STL中的另外兩個重要組件——map和set。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.co…

[學習] CORDIC算法詳解:從數學原理到反正切計算實戰

CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰 文章目錄CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰引言一、數學原理二、求解流程&#xff08;旋轉模式&#xff09;三、典型應用場景四、反正切計算示例&#xff08;Python實現&#xff09;五、算法流程可視…

3款強力的Windows系統軟件卸載工具

1、Geek 下載地址&#xff1a;https://download.csdn.net/download/weixin_42203093/91625765 Geek Uninstaller 是一款專業的 Windows 軟件卸載工具&#xff0c;主要用于卸載軟件并清理殘留垃圾&#xff1a; 特點 體積小巧便攜&#xff1a;軟件體積約為 1.7M&#xff0c;是單…

AcWing 4579. 相遇問題

這道題做個今天的結尾 比較簡單 正在備戰csp嗎&#xff0c;正好刷一下 難度&#xff1a;簡單時/空限制&#xff1a;1s / 256MB總通過數&#xff1a;1738總嘗試數&#xff1a;2584來源&#xff1a; CSP-J 2022 模擬賽 原題鏈接 4579. 相遇問題 - AcWing題庫 題目描述 一…

基于clodop和Chrome原生打印的標簽實現方法與性能對比

今天想看看&#xff0c;基于clodop和Chrome原生打印的標簽實現方法與性能對比。先看看DeepSeek關于這個問題的回答&#xff01; CloudPrint 和 Chrome 原生打印的區別 基本概念差異 CloudPrint (Clodop) 是基于云的打印服務解決方案需要安裝專門的客戶端程序支持跨平臺、跨設備…

百度網盤如何做到下載速度最快?OpenSpeedy綠色安裝版下載,開源免費網盤加速

下載地址獲取點擊這里打開&#xff1a;OpenSpeedy下載地址 打開解壓后的文件夾&#xff0c;找到【OpenSpeedy.exe】應用程序&#xff0c;右鍵選擇【以管理員身份運行】。 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 主要特性&#xff1a; 免費開源蠻…

科技云報到:熱鏈路革命:阿卡 CRM 的 GTM 定位突圍

科技云報道原創。在企業數字化的工具箱里&#xff0c;“CRM” 一詞早已不是 “全流程客戶管理” 的代名詞&#xff0c;而是從營銷獲客到客戶信息沉淀&#xff0c;再到長期關系維護&#xff0c;仿佛要包攬從線索到復購的所有環節。但成立僅兩年半的阿卡 CRM&#xff0c;卻在實踐…

什么是Graphical Abstract

什么是Graphical Abstract 現在都需要用Graphical Abstract&#xff0c;新加的好像。圖形摘要&#xff08;Graphical Abstract&#xff09;是學術論文中一種以可視化方式濃縮呈現研究核心內容的圖表&#xff0c;它通過簡潔的圖形、流程圖、示意圖或組合視覺元素&#xff0c;直觀…