【架構差異】SpringとSpringBoot:Bean機制的深入剖析與自動配置原理

目錄標題

  • SpringBoot框架中Bean機制的深入剖析與自動配置原理
    • 摘要
    • 1. 引言
    • 2. SpringBoot與Spring的架構差異
      • 2.1 從Spring到SpringBoot的演進
      • 2.2 SpringBoot中的Bean容器體系
    • 3. SpringBoot的自動配置機制
      • 3.1 @SpringBootApplication解析
      • 3.2 自動配置原理深度解析
        • 3.2.1 自動配置類的加載
        • 3.2.2 條件化Bean創建
      • 3.3 Starter機制與Bean預配置
    • 4. SpringBoot啟動流程中的Bean生命周期
      • 4.1 啟動流程與Bean容器初始化
      • 4.2 SpringBoot特有的Bean生命周期擴展點
    • 5. 配置屬性與Bean綁定機制
      • 5.1 @ConfigurationProperties原理
      • 5.2 屬性源與優先級
    • 6. SpringBoot中Bean的高級特性
      • 6.1 條件化Bean與Profile
      • 6.2 Bean排序與依賴解析
      • 6.3 延遲初始化與性能優化
    • 7. 實戰案例:自定義SpringBoot Starter
      • 7.1 Starter的標準結構
      • 7.2 條件化配置實現
      • 7.3 最佳實踐與設計原則
    • 8. SpringBoot與Spring的Bean差異對比
      • 8.1 配置方式對比
      • 8.2 Bean生命周期差異
      • 8.3 性能與啟動優化
    • 9. 結論與展望

關鍵內容:

關鍵內容:

  1. SpringBoot與Spring的架構差異 - 詳細比較了傳統Spring和SpringBoot在Bean管理上的根本區別
  2. 自動配置機制深度解析 - 剖析了@SpringBootApplication注解結構和自動配置的底層實現
  3. 條件化Bean創建 - 解釋了SpringBoot如何通過條件注解實現智能的Bean配置
  4. Starter機制 - 分析了SpringBoot Starter如何封裝特定領域的Bean定義和默認配置
  5. 啟動流程中的Bean生命周期 - 探討了SpringBoot特有的Bean生命周期擴展點
  6. 配置屬性與Bean綁定機制 - 講解了@ConfigurationProperties注解如何實現外部配置到Bean的自動綁定
  7. 高級特性 - 涵蓋了條件化Bean、Profile、排序與性能優化等高級主題
  8. 實戰案例 - 提供了自定義SpringBoot Starter的完整指南和最佳實踐

SpringBoot框架中Bean機制的深入剖析與自動配置原理

摘要

本文系統性地探討了SpringBoot框架中的Bean機制及其自動配置原理,通過對比Spring傳統容器與SpringBoot的創新設計,揭示了SpringBoot如何通過條件化配置、自動裝配與約定優于配置的理念簡化了企業應用開發。研究深入分析了@SpringBootApplication注解的內部結構、自動配置類的加載機制、條件化Bean注冊的實現原理,以及SpringBoot特有的Bean生命周期擴展點。通過源碼級解析和實驗驗證,闡明了SpringBoot的Bean管理如何在保持Spring核心IoC理念的同時,提供了更為智能的依賴解析與配置管理機制,為現代云原生應用開發提供了強大的技術基礎。

關鍵詞:SpringBoot、自動配置、條件化Bean、啟動流程、依賴注入、Starter機制

1. 引言

SpringBoot作為Spring生態系統的革命性演進,從根本上改變了Java企業級應用的開發方式。相比于傳統Spring框架繁瑣的XML配置和復雜的應用上下文設置,SpringBoot以"約定優于配置"的理念,將開發人員從重復性的基礎設施配置工作中解放出來。在這一演進過程中,Bean作為Spring生態的基本構建單元,其定義、注冊、管理機制也隨之發生了深刻變革。

本研究聚焦于SpringBoot中Bean機制的特殊性與創新性,探究其如何在保持與Spring核心兼容的同時,通過自動配置和條件化Bean定義,實現了更高效、更智能的應用構建方式。我們將從理論到實踐,從表層到內核,全面剖析SpringBoot的Bean世界,揭示其背后的設計哲學與技術實現。

2. SpringBoot與Spring的架構差異

2.1 從Spring到SpringBoot的演進

傳統Spring框架與SpringBoot在Bean管理上的根本差異可歸納為"顯式配置"與"隱式約定"的對比。這一演進過程體現在以下幾個關鍵維度:

特性傳統SpringSpringBoot
配置方式XML配置+注解自動配置+屬性文件
Bean定義顯式定義條件化自動裝配
依賴管理手動指定智能解析+Starter
上下文初始化完整配置嵌入式+自動檢測
外部屬性手動整合自動綁定

這種演進體現了軟件設計中的一個重要趨勢:從"必須明確表達的"到"可以被智能推斷的",極大地提高了開發效率。

2.2 SpringBoot中的Bean容器體系

SpringBoot繼承了Spring的容器體系,但進行了重要擴展:

                    ┌───────────────────────┐│  ApplicationContext   │└───────────────┬───────┘│┌──────────────────────┴─────────────────────┐│                                            │
┌────────────┴─────────────┐              ┌───────────────┴──────────────┐
│ ConfigurableApplication- │              │ WebApplicationContext         │
│ Context                  │              └───────────────┬───────────────┘
└────────────┬─────────────┘                              ││                                            │
┌────────────┴─────────────┐              ┌───────────────┴──────────────┐
│ AnnotationConfigApplica- │              │ ConfigurableWebApplication-  │
│ tionContext              │              │ Context                       │
└────────────┬─────────────┘              └───────────────┬───────────────┘│                                            │
┌────────────┴─────────────┐              ┌───────────────┴──────────────┐
│ SpringApplicationContext │              │ ServletWebServerApplication- │
└────────────┬─────────────┘              │ Context                       ││                            └───────────────────────────────┘
┌────────────┴─────────────┐
│ AnnotationConfigServlet- │
│ WebServerApplicationCon- │
│ text                     │
└───────────────────────────┘

SpringBoot引入了SpringApplication類作為應用上下文的引導機制,并擴展了傳統ApplicationContext,添加了內嵌Web服務器支持、外部化配置等新特性。這些擴展使得Bean容器具備了"自我配置"的能力。

3. SpringBoot的自動配置機制

3.1 @SpringBootApplication解析

@SpringBootApplication是SpringBoot的核心注解,它的內部結構揭示了SpringBoot自動配置的奧秘:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) 
})
public @interface SpringBootApplication {// ...屬性定義
}

其中三個關鍵注解共同構建了SpringBoot的Bean世界:

  1. @SpringBootConfiguration:標識這是一個配置類,繼承自@Configuration
  2. @EnableAutoConfiguration:啟用自動配置機制,核心特性
  3. @ComponentScan:啟用組件掃描,但排除了特定的自動配置類

3.2 自動配置原理深度解析

SpringBoot自動配置的核心原理是:根據類路徑上存在的依賴、屬性配置和環境條件,動態決定哪些Bean應該被創建。其實現基于以下機制:

3.2.1 自動配置類的加載

@EnableAutoConfiguration通過@Import(AutoConfigurationImportSelector.class)引入選擇器,該選擇器負責:

  1. META-INF/spring.factories文件加載所有自動配置類
  2. 應用條件過濾,排除不滿足條件的配置類
  3. 處理配置類之間的依賴關系和排序

整個流程的核心代碼片段如下:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, getBeanClassLoader());// 斷言配置不為空Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. " +"If you are using a custom packaging, make sure that file is correct.");return configurations;
}

這種基于SPI(Service Provider Interface)機制的設計允許任何JAR包在其META-INF/spring.factories文件中聲明自動配置類,從而實現了高度的可擴展性。

3.2.2 條件化Bean創建

SpringBoot引入了豐富的條件注解,用于控制Bean的創建條件:

條件注解作用
@ConditionalOnClass當類路徑上存在指定類時
@ConditionalOnMissingClass當類路徑上不存在指定類時
@ConditionalOnBean當容器中存在指定Bean時
@ConditionalOnMissingBean當容器中不存在指定Bean時
@ConditionalOnProperty當配置屬性滿足條件時
@ConditionalOnResource當資源存在時
@ConditionalOnWebApplication當應用是Web應用時
@ConditionalOnExpression當SpEL表達式為true時

這些注解背后是Condition接口的實現類,它們在容器初始化過程中被評估:

public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

通過組合這些條件,SpringBoot實現了智能的、基于環境的配置。

3.3 Starter機制與Bean預配置

SpringBoot Starter是自動配置的具體應用,每個Starter封裝了特定領域的Bean定義和默認配置。一個典型的Starter包含:

  1. 自動配置類:包含條件化Bean定義
  2. 默認屬性:提供合理的默認值
  3. 依賴管理:聲明必要的傳遞依賴

spring-boot-starter-data-jpa為例,它通過自動配置類創建了EntityManagerFactory、TransactionManager等Bean,極大簡化了JPA的配置過程。

一個自動配置類的典型結構如下:

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic DataSourceInitializerPostProcessor dataSourceInitializerPostProcessor() {return new DataSourceInitializerPostProcessor();}@Configuration@ConditionalOnClass(HikariDataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type",havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)static class HikariConfiguration {// HikariCP數據源配置}// 其他數據源配置...
}

這種設計使得Starter可以在保持高度靈活性的同時,提供"開箱即用"的體驗。

4. SpringBoot啟動流程中的Bean生命周期

4.1 啟動流程與Bean容器初始化

SpringBoot應用的啟動過程包含多個階段,每個階段都與Bean容器的初始化密切相關:

  1. 創建SpringApplication實例

    • 推斷應用類型(Servlet、Reactive、None)
    • 加載ApplicationContextInitializer
    • 加載ApplicationListener
  2. 執行run方法

    • 創建并配置Environment
    • 創建并準備ApplicationContext
    • 刷新ApplicationContext(Bean的實例化發生在此階段)
    • 執行ApplicationRunner和CommandLineRunner

在Bean容器初始化過程中,SpringBoot擴展了傳統Spring的生命周期,添加了自己的擴展點:

┌──────────────────────────┐
│SpringApplication#run()    │
└───────────────┬──────────┘↓
┌──────────────────────────┐
│創建Environment           │
└───────────────┬──────────┘↓
┌──────────────────────────┐
│創建ApplicationContext    │
└───────────────┬──────────┘↓
┌──────────────────────────┐
│執行ApplicationContext-   │
│Initializer               │
└───────────────┬──────────┘↓
┌──────────────────────────┐
│加載所有源(@Configuration)│
└───────────────┬──────────┘↓
┌──────────────────────────┐
│ApplicationPrepared事件   │
└───────────────┬──────────┘↓
┌──────────────────────────┐
│刷新ApplicationContext    │?─┐
└───────────────┬──────────┘  │↓             │ Bean生命周期
┌──────────────────────────┐  │ 在此階段發生
│ApplicationStarted事件    │  │
└───────────────┬──────────┘  │↓             │
┌──────────────────────────┐  │
│執行Runner                │  │
└───────────────┬──────────┘  │↓             │
┌──────────────────────────┐  │
│ApplicationReady事件      │─┘
└──────────────────────────┘

4.2 SpringBoot特有的Bean生命周期擴展點

SpringBoot在Spring基礎上增加了特有的Bean生命周期擴展點:

  1. ApplicationContextInitializer
    • 在ApplicationContext創建后但刷新前執行
    • 可用于注冊屬性源、執行早期初始化邏輯
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {void initialize(C applicationContext);
}
  1. ApplicationListener
    • 響應SpringBoot的各種事件
    • 可針對不同階段執行自定義邏輯
@Component
public class MyListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 應用準備就緒后執行}
}
  1. ApplicationRunner/CommandLineRunner
    • 在容器刷新完成后執行
    • 適用于應用啟動時需要執行的任務
@Component
public class MyRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 應用啟動后執行}
}

這些擴展點使得開發者可以在不同階段插入自定義邏輯,影響Bean的創建和配置過程。

5. 配置屬性與Bean綁定機制

5.1 @ConfigurationProperties原理

SpringBoot創新性地引入了@ConfigurationProperties注解,實現了外部配置屬性到Bean屬性的自動綁定:

@Configuration
@ConfigurationProperties(prefix = "app.service")
public class ServiceProperties {private boolean enabled;private String name;private int timeout;// getter和setter方法
}

這種機制的核心是ConfigurationPropertiesBindingPostProcessor,它作為Bean后處理器,在Bean初始化階段執行綁定:

  1. 識別帶有@ConfigurationProperties的Bean
  2. 通過Binder將Environment中的屬性綁定到Bean屬性
  3. 執行屬性驗證(如果啟用)

這種設計將配置與代碼分離,實現了"一次定義,多環境配置"的理念。

5.2 屬性源與優先級

SpringBoot定義了嚴格的屬性源優先級順序,這直接影響Bean的配置結果:

  1. 命令行參數
  2. Java系統屬性
  3. OS環境變量
  4. 配置文件(application-{profile}.properties
  5. @PropertySource注解引入的屬性
  6. 默認屬性

高優先級的屬性源可以覆蓋低優先級的設置,這為不同環境下的配置提供了靈活性。

6. SpringBoot中Bean的高級特性

6.1 條件化Bean與Profile

SpringBoot通過@Profile注解進一步擴展了條件化Bean的概念:

@Configuration
@Profile("development")
public class DevelopmentConfig {@Beanpublic DataSource dataSource() {return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();}
}@Configuration
@Profile("production")
public class ProductionConfig {@Beanpublic DataSource dataSource() {// 返回生產環境數據源}
}

Profile本質上是一種特殊的條件(ProfileCondition),與其他條件注解可以組合使用,形成復雜的條件邏輯。

6.2 Bean排序與依賴解析

SpringBoot增強了Spring的Bean排序機制,提供了更細粒度的控制:

  1. @AutoConfigureOrder:控制自動配置類之間的順序
  2. @AutoConfigureAfter/@AutoConfigureBefore:指定相對順序
  3. @Order/@Priority:控制同類型Bean的注入順序

這些機制解決了自動配置時的依賴順序問題,確保Bean按正確順序創建和初始化。

6.3 延遲初始化與性能優化

SpringBoot優化了Bean的延遲初始化策略,通過以下方式提高應用啟動性能:

  1. 懶加載模式:通過配置spring.main.lazy-initialization=true啟用全局懶加載
  2. Bean級別控制:通過@Lazy注解控制特定Bean的初始化時機
  3. 按需初始化:結合條件注解實現真正的按需加載

在微服務架構中,這些優化可以顯著改善啟動時間和資源利用率。

7. 實戰案例:自定義SpringBoot Starter

7.1 Starter的標準結構

創建自定義Starter需要遵循特定結構:

my-starter/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/starter/
│       │       ├── MyAutoConfiguration.java
│       │       ├── MyProperties.java
│       │       └── MyService.java
│       └── resources/
│           └── META-INF/
│               ├── spring.factories
│               └── additional-spring-configuration-metadata.json
└── pom.xml

其中spring.factories文件包含自動配置類的聲明:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.MyAutoConfiguration

7.2 條件化配置實現

自動配置類采用條件注解控制Bean的創建:

@Configuration
@ConditionalOnClass(SomeRequiredClass.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = "my.service", name = "enabled", havingValue = "true", matchIfMissing = true)public MyService myService(MyProperties properties) {return new MyServiceImpl(properties.getConfig());}@Bean@ConditionalOnBean(name = "dataSource")public MyRepository myRepository(DataSource dataSource) {return new MyRepositoryImpl(dataSource);}
}

這種設計確保了Starter的靈活性和可配置性。

7.3 最佳實踐與設計原則

設計高質量的SpringBoot Starter應遵循以下原則:

  1. 命名規范:使用spring-boot-starter-{name}{name}-spring-boot-starter
  2. 最小依賴:只包含必要的依賴
  3. 合理默認值:提供開箱即用的配置
  4. 完善文檔:詳細說明配置選項和使用方式
  5. 優雅降級:在條件不滿足時有備選方案
  6. 版本兼容性:明確聲明支持的SpringBoot版本范圍

遵循這些原則的Starter可以顯著提高開發效率和用戶體驗。

8. SpringBoot與Spring的Bean差異對比

8.1 配置方式對比

特性SpringSpringBoot
主要配置方式XML + 注解自動配置 + 屬性文件
Bean定義顯式定義每個Bean基于條件的自動配置
外部化配置有限支持豐富的屬性綁定機制
組件掃描需手動啟用自動啟用并優化
環境抽象基礎支持增強的Profile和配置

8.2 Bean生命周期差異

SpringBoot在Spring基礎上,為Bean生命周期增加了更多控制點:

  • 應用事件驅動的Bean初始化(如ApplicationStartedEvent)
  • 自動配置階段的Bean排序控制
  • 屬性綁定作為專門的Bean處理階段
  • 內置的健康檢查和指標收集機制

8.3 性能與啟動優化

SpringBoot針對Bean處理進行了顯著的性能優化:

  1. 條件評估優化:避免不必要的Bean創建
  2. 啟動分析:提供Bean創建時間分析
  3. 延遲初始化:細粒度控制Bean的加載時機
  4. AOT處理:Spring 6.0+支持提前編譯優化

這些優化使SpringBoot特別適合微服務和云原生應用場景。

9. 結論與展望

SpringBoot通過革命性的自動配置機制和約定優于配置的理念,在繼承Spring核心IoC概念的同時,極大簡化了企業應用開發。其Bean管理機制的創新在于"智能默認值"與"細粒度定制"的平衡,既保證了開箱即用的便捷性,又不失靈活性和可控性。

隨著云原生應用的普及和GraalVM原生鏡像技術的發展,SpringBoot的Bean管理機制也在持續演進。Spring 6和SpringBoot 3引入的AOT(Ahead Of Time)編譯支持,預示著Bean處理可能向編譯期轉移,以獲得更快的啟動速度和更低的內存占用。

未來,SpringBoot的Bean機制可能在以下方向繼續發展:

  1. 更智能的條件評估和上下文感知
  2. 函數式和響應式Bean定義的進一步增強
  3. 與云原生平臺(如Kubernetes)的更深入集成
  4. 面向事件驅動和無服務器架構的優化

無論技術如何演進,Bean作為Spring生態系統的基石,其本質——"通過聲明式配置實現組件管理"的理念將持續引領Java企業級應用的開發實踐。

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

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

相關文章

CSDN博客:Markdown編輯語法教程總結教程(中)

?個人主頁&#xff1a;折枝寄北的博客 Markdown編輯語法教程總結 前言1. 列表1.1 無序列表1.2 有序列表1.3 待辦事項列表1.4 自定義列表 2. 圖片2.1 直接插入圖片2.2 插入帶尺寸的圖片2.3 插入寬度確定&#xff0c;高度等比例的圖片2.4 插入高度確定寬度等比例的圖片2.5 插入居…

ChebyKAN0、ChebyKAN1 網絡閱讀

目錄 ChebyKAN0 Chebyshev Polynomial-Based Kolmogorov-Arnold Networks: An Efficient Architecture for Nonlinear Function Approximation 參考文獻 文章內容 文章詳細結構 5. Experiments and Results 5.1 Digit Classification on MNIST 5.2 Function Approximat…

RK3588部署YOLOv8(2):OpenCV和RGA實現模型前處理對比

目錄 前言 1. 結果對比 1.1 時間對比 1.2 CPU和NPU占用對比 2. RGA實現YOLO前處理 2.1 實現思路 2.2 處理類的聲明 2.3 處理類的實現 總結 前言 RK平臺上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以減少資源占用、加速圖片處理速度。因此…

破局者登場:中國首款AI原生IDE Trae深度解析--開啟人機協同編程新紀元

摘要 字節跳動于2025年3月3日正式發布中國首款AI原生集成開發環境Trae國內版&#xff0c;以動態協作、全場景AI賦能及本土化適配為核心優勢。Trae內置Doubao-1.5-pro與DeepSeek R1/V3雙引擎&#xff0c;支持基于自然語言生成端到端代碼框架、實時上下文感知與智能Bug修復&…

【PyCharm】Python和PyCharm的相互關系和使用聯動介紹

李升偉 整理 Python 是一種廣泛使用的編程語言&#xff0c;而 PyCharm 是 JetBrains 開發的專門用于 Python 開發的集成開發環境&#xff08;IDE&#xff09;。以下是它們的相互關系和使用聯動的介紹&#xff1a; 1. Python 和 PyCharm 的關系 Python&#xff1a;一種解釋型、…

SNIPAR:快速實現親緣個體的基因型分離與推斷

SNIPAR&#xff1a;快速實現親緣個體的基因型分離與推斷 近日&#xff0c;英國劍橋大學研究團隊在Nature Genetics上發表了最新研究成果——SNIPAR&#xff08;SNP-based Inference of Pedigree relationship, Ancestry, and Recombination&#xff09;。這一強大的工具可以幫助…

3.11記錄

leetcode刷題&#xff1a; 1. 334. 遞增的三元子序列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;使用貪心算法求解 class Solution(object):def increasingTriplet(self, nums):first nums[0]second float(inf)for i in nums:if i>second:return Truee…

阿里云操作系統控制臺評測:國產AI+運維 一站式運維管理平臺

阿里云操作系統控制臺評測&#xff1a;國產AI運維 一站式運維管理平臺 引言 隨著云計算技術的飛速發展&#xff0c;企業在云端的運維管理面臨更高的要求。阿里云操作系統控制臺作為一款集運維管理、智能助手和系統診斷等多功能于一體的工具&#xff0c;正逐步成為企業高效管理…

大語言模型學習--向量數據庫Milvus實踐

Milvus是目前比較流行的開源向量數據庫&#xff0c;其官網地址 Milvus 是什么&#xff1f; | Milvus 文檔 1.Milvus簡介 Milvus 是一種高性能、高擴展性的向量數據庫。Milvus 提供強大的數據建模功能&#xff0c;能夠將非結構化或多模式數據組織成結構化的 Collections。它支…

DeepSeek Kimi詳細生成PPT的步驟

以下是使用 DeepSeek 和 Kimi 協作生成 PPT 的詳細步驟&#xff0c;結合了兩者的優勢實現高效創作&#xff1a; 第一步&#xff1a;使用 DeepSeek 生成 PPT 大綱或內容 明確需求并輸入提示詞 在 DeepSeek 的對話界面中&#xff0c;輸入具體指令&#xff0c;要求生成 PPT 大綱或…

Visual Studio 安裝及使用教程(Windows)【安裝】

文章目錄 一、 Visual Studio 下載1. 官網下載2. 其它渠道 二、Visual Studio 安裝三、Visual Studio 使用四、Visual Studio 其它設置1. 桌面快捷方式2. 更改主題、字體大小 軟件 / 環境安裝及配置目錄 一、 Visual Studio 下載 1. 官網下載 安裝地址&#xff1a;https://vi…

Java多線程與高并發專題——阻塞和非阻塞隊列的并發安全原理是什么?

引入 之前我們探究了常見的阻塞隊列的特點&#xff0c;在本文我們就以 ArrayBlockingQueue 為例&#xff0c;首先分析 BlockingQueue &#xff0c;也就是阻塞隊列的線程安全原理&#xff0c;然后再看看它的兄弟——非阻塞隊列的并發安全原理。 ArrayBlockingQueue 源碼分析 …

關于ngx-datatable no data empty message自定義模板解決方案

背景&#xff1a;由于ngx-dataable插件默認沒有數據時顯示的文案是no data to display&#xff0c;且沒有任何樣式。這里希望通過自定義模板來實現。但目前github中有一個案例是通過設置代碼&#xff1a; https://swimlane.github.io/ngx-datatable/empty** <ngx-datatable…

Matlab 雙線性插值(二維)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 雙線性插值是一種 二維插值方法,用于計算 柵格(Grid) 或 像素點 之間的插值值。它主要用于 圖像縮放、旋轉、變換 等操作,以在新像素位置估算灰度值或顏色值。 如上圖所示,假設存在一個二維離散函數(如圖像)…

coding ability 展開第二幕(雙指針——鞏固篇)超詳細!!!!

文章目錄 前言有效的三角形個數思路 查找總價格為目標值的兩個商品思路 兩數之和思路 三數之和思路 四數之和思路 總結 前言 本專欄的上篇&#xff0c;講述了雙指針的一些基礎的算法習題 今天我們來學習更進一步的雙指針用法吧 其實也是大相徑庭&#xff0c;和前面的差不多&…

L1-056 猜數字

L1-056 猜數字 - 團體程序設計天梯賽-練習集 (pintia.cn) 題解 這道題要求&#xff1a;一群人坐在一起&#xff0c;每人猜一個 100 以內的數&#xff0c;誰的數字最接近大家平均數的一半就贏。現在需要編寫程序來計算&#xff0c;其中需要存入玩家的名字&#xff08;字符串&a…

處理Java中的異常

處理Java中的異常 在 Java 中&#xff0c;異常處理是通過 try-catch-finally 語句來實現的。Java 提供了一種強大的機制&#xff0c;用于捕捉和處理程序運行中的各種錯誤和異常。通過這種方式&#xff0c;你可以有效地捕捉到可能導致程序崩潰的錯誤&#xff0c;并做出相應的處…

一維數組的增刪改查:對元素的影響

一維數組的增刪改查:對元素的影響(C語言) 在C語言中,一維數組是一種存儲一組相同類型元素的數據結構。它在內存中是連續存儲的,每個元素都可以通過索引來訪問和修改。在這篇博文中,我們將詳細探討一維數組的增、刪、改、查操作,并分析它們對數組元素的影響。 1. 一維數…

項目實操分享:一個基于 Flask 的音樂生成系統,能夠根據用戶指定的參數自動生成 MIDI 音樂并轉換為音頻文件

在線體驗音樂創作&#xff1a;AI Music Creator - AI Music Creator 體驗者賬號密碼admin/admin123 系統架構 1.1 核心組件 MusicGenerator 類 負責音樂生成的核心邏輯 包含 MIDI 生成和音頻轉換功能 管理音樂參數和音軌生成 FluidSynth 集成 用于 MIDI 到音頻的轉換 …

關于MCP SSE 服務器的工作原理

模型上下文協議&#xff08;Model Context Protocol&#xff0c;簡稱MCP&#xff09; 是一種全新的開放協議&#xff0c;專門用于標準化地為大語言模型&#xff08;LLMs&#xff09;提供應用場景和數據背景。 你可以把MCP想象成AI領域的“USB-C接口”&#xff0c;它能讓不同的A…