Spring Boot 是如何簡化 IoC 的配置的?

首先Spring Boot 并沒有發明新的 IoC 理論,它做的也不是替換掉 Spring IoC 容器。相反,Spring Boot 是 Spring IoC 思想的實踐者和簡化者。它通過**“約定優于配置”(Convention over Configuration)**的理念,將原本繁瑣的 IoC 配置工作降到了最低。

我們來對比一下“沒有 Spring Boot 的時代”(純 Spring 框架)和“有了 Spring Boot 之后”的區別。


1. 沒有 Spring Boot 的時代(純 Spring 框架)

在 Spring Boot 出現之前,要搭建一個基于 Spring 的 Web 應用,你需要手動完成大量 IoC 相關的配置工作:

a. 繁瑣的 XML 配置(早期)

你需要創建一個或多個 XML 文件,在里面手動定義每一個 Bean,并配置它們的依賴關系。

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 1. 必須手動開啟注解掃描 --><context:component-scan base-package="com.example.myapp"/><!-- 2. 手動配置一個數據源 Bean --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="password"/></bean><!-- 3. 手動配置 JdbcTemplate,并注入 dataSource --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg ref="dataSource"/></bean><!-- 還有更多... TransactionManager, ViewResolver... -->
</beans>
b. Java 配置(后期,有所改進)

后來 Java 配置(@Configuration)取代了大部分 XML,但你仍然需要手動配置很多東西。

@Configuration
@ComponentScan("com.example.myapp") // 1. 仍然需要手動指定掃描路徑
public class AppConfig {// 2. 仍然需要手動創建 DataSource Bean@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;}// ... 其他 Bean 的配置
}
c. 手動啟動容器

你還需要一個 main 方法來手動加載配置,并啟動 Spring IoC 容器。

public class Main {public static void main(String[] args) {// 手動創建和啟動 IoC 容器ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 從容器中獲取 BeanMyService myService = context.getBean(MyService.class);myService.doWork();}
}

痛點總結:

  1. 配置繁瑣:大量的 Bean(如數據源、事務管理器、視圖解析器)需要你像搭積木一樣手動配置。
  2. 需要明確指定掃描路徑@ComponentScan<context:component-scan> 必須明確告訴 Spring 去哪里找你的 Bean。
  3. 依賴管理復雜:你需要手動管理一大堆 spring-core, spring-web, spring-webmvc 等 jar 包,并確保它們的版本相互兼容,這簡直是噩夢。
  4. 需要手動啟動:啟動容器的代碼是樣板化的,但每個項目都得寫一遍。

2. 有了 Spring Boot 之后

Spring Boot 通過兩大神器,徹底改變了這一切:Starters(啟動器)Auto-Configuration(自動配置)

a. @SpringBootApplication:一個頂三個

你只需要在主類上加一個注解:

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {// 一行代碼啟動,所有事情都自動完成了SpringApplication.run(MyApplication.class, args);}
}

這個 @SpringBootApplication 注解其實是一個組合注解,它默認包含了:

  • @Configuration: 表明這是一個 Java 配置類。
  • @EnableAutoConfiguration: 這是 Spring Boot 的核心魔法! 它會告訴 Spring Boot 根據你 classpath(類路徑)上的 jar 包,來“猜測”你可能需要什么樣的配置,并自動幫你完成。
  • @ComponentScan: 自動掃描主類所在的包及其所有子包下的組件(@Component, @Service 等),你再也不用指定 base-package 了。
b. Starters:簡化依賴管理

你不再需要逐個添加 Spring 的 jar 包。想用 Web 功能?只需要一個依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

這個 starter 會自動幫你引入所有相關的、且版本兼容的依賴(Spring MVC, Tomcat, Jackson 等)。想用數據庫?加入 spring-boot-starter-data-jpa 即可。

c. Auto-Configuration:智能的 Bean 配置

這是對 IoC 配置的最大簡化。自動配置的工作原理是:

  1. 偵測 Classpath:Spring Boot 檢查你的項目中引入了哪些 Starters 和庫。
  2. 條件化配置:它內部有大量的 @ConditionalOnClass, @ConditionalOnBean 等條件注解。
    • 例如:當它發現你的 classpath 中有 tomcat-embedded.jar 時(由 starter-web 引入),它就自動為你配置好一個嵌入式的 Tomcat 服務器 Bean。
    • 又例如:當它發現 classpath 中有 DataSource.class 并且你沒有手動配置一個 DataSource Bean 時,它就會嘗試讀取 application.properties 文件中的 spring.datasource.* 屬性,并自動為你創建一個 DataSource Bean。

所以,之前你需要手動配置的 DataSource,現在只需要在 application.properties 中提供幾個屬性就行了:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password

Spring Boot 會在幕后為你完成 @Bean 的創建和配置工作。

總結

特性純 Spring 框架Spring Boot 如何簡化
組件掃描需手動配置 <context:component-scan>@ComponentScan(basePackages=...)@SpringBootApplication 默認掃描主類及其子包,無需配置。
依賴管理需手動添加多個 jar 包并處理版本沖突。提供 Starters,只需一個依賴即可引入一套功能和兼容的版本。
通用 Bean 配置需手動配置 DataSource, TransactionManager, DispatcherServlet 等大量樣板 Bean。通過 Auto-Configuration,根據 classpath 自動配置絕大多數通用 Bean。
外部配置需手動配置 PropertySourcesPlaceholderConfigurer 來讀取 .properties 文件。默認支持 application.properties/.yml,直接通過 @Value@ConfigurationProperties 即可注入。
應用啟動需手動編寫 main 方法來創建和啟動 ApplicationContext提供 SpringApplication.run() 一行代碼即可啟動,內嵌 Web 服務器。

總而言之,Spring Boot 并沒有改變 IoC 的核心,而是為 IoC 容器穿上了一件極其智能的“自動化裝甲”。它將業界沉淀下來的實踐固化為“約定”和“自動配置”,讓開發者從繁瑣的配置工作中徹底解放,真正做到“開箱即用”,讓開發者專注于業務邏輯的實現。

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

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

相關文章

Go語言中的組合式接口設計模式

文章目錄Go語言中的組合式接口設計模式背景和需求組合式接口設計Go語言中的組合式接口設計模式 背景和需求 在微服務架構和復雜業務系統中&#xff0c;我們經常需要調用多個外部服務或內部模塊。傳統的做法是將所有方法都放在一個大接口中&#xff0c;但這種設計會導致接口臃…

React - createPortal

什么是createPortal&#xff1f;注意這是一個API&#xff0c;不是組件&#xff0c;他的作用是&#xff1a;將一個組件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport組件類似。用法 import { createPortal } from react-dom;const App () > {return createPortal(<div…

Cursor的使用

Cursor的使用 Ctrl L 打開歷史對話記錄 Tab智能助手 1.單行/多行補全 已有代碼片段&#xff1a; //需求&#xff1a;寫一個工具類計算數組平均值 public class ArrayUtils {//按tab會完成補全 }按tab鍵- Cursor 自動生成代碼: //需求&#xff1a;寫一個工具類計算數組平均值 p…

17.使用DenseNet網絡進行Fashion-Mnist分類

17.1 DenseNet網絡結構設計import torch from torch import nn from torchsummary import summary #卷積層 def conv_block(input_channels,num_channels):netnn.Sequential(nn.BatchNorm2d(input_channels),nn.ReLU(),nn.Conv2d(input_channels,num_channels,kernel_size3,pad…

網安系列【16】之Weblogic和jboss漏洞

文章目錄一 Weblogic1.1 Weblogic相關漏洞1.2 Weblogic漏洞發現1.3 Weblogic漏洞利用二 Jboss2.1 Jboss漏洞2.2 Jboss識別與漏洞利用一 Weblogic WebLogic 是由 Oracle公司 開發的一款基于Java EE&#xff08;現稱Jakarta EE&#xff09;的企業級應用服務器&#xff0c;主要用…

Unity URP + XR 自定義 Skybox 在真機變黑問題全解析與解決方案(支持 Pico、Quest 等一體機)

在使用 Unity 的 URP 渲染管線開發 XR 應用&#xff08;如 Pico Neo、Pico 4、Quest 2/3 等一體機&#xff09;時&#xff0c;很多開發者遇到一個奇怪的問題&#xff1a;打包后&#xff0c;Skybox&#xff08;天空盒&#xff09;在某些角度下突然變黑&#xff0c;只在轉動頭部后…

Cursor、飛算JavaAI、GitHub Copilot、Gemini CLI 等熱門 AI 開發工具合集

Cursor&#xff1a;代碼編寫的智能伙伴?Cursor 是 Anysphere 公司推出的一款 AI 編程工具&#xff0c;它基于微軟開源代碼編輯器 VS Code 開發&#xff0c;將 AI 技術深度整合到開發人員的工作流程中。Cursor 的功能十分強大&#xff0c;不僅能夠自動用純英文編寫代碼&#xf…

如何安裝歷史版本或指定版本的 git

背景 有的時候&#xff0c;我們需要安裝指定版本的git&#xff0c;或者希望舊一點的&#xff0c;畢竟我就遇到最新的2.50.1在win10安裝后打開就一閃而過&#xff0c;而安裝2.49.1就不會 下載 官網可能比較難找&#xff0c;但是這個github倉庫&#xff1a;https://github.com/gi…

LaCo: Large Language Model Pruning via Layer Collapse

發表&#xff1a;EMNLP_FINDING_2024 機構&#xff1a;Shanghai Jiao Tong University 連接&#xff1a;LaCo: Large Language Model Pruning via Layer Collapse - ACL Anthology 代碼&#xff1a;https://github.com/yangyifei729/LaCo Abstract 基于 Transformer 的大語…

服務器內核級故障排查

目錄 **檢查內核級故障(Oops/Panic)的具體操作步驟****1. 查看完整 `dmesg` 日志(含時間戳)****2. 過濾關鍵錯誤信息****3. 檢查系統日志中的內核消息****4. 分析最近一次啟動的日志****5. 檢查是否有 `vmcore` 轉儲文件****常見內核錯誤示例及含義**補充說明:檢查內核級故…

Flink學習筆記:整體架構

開一個新坑&#xff0c;系統性的學習下 Flink&#xff0c;計劃從整體架構到核心概念再到調優方法&#xff0c;最后是相關源碼的閱讀。 今天就來學習 Flink 整體架構&#xff0c;我們先看官網的架構圖圖中包含三部分&#xff0c;分別是 Client、JobManager 和 TaskManager。其中…

【LeetCode 熱題 100】105. 從前序與中序遍歷序列構造二叉樹——(解法二)O(n)

Problem: 105. 從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 【LeetCode 熱題 100】105. 從前序與中序遍歷序列構…

完美卸載 Ubuntu 雙系統:從規劃到實施的完整指南

&#x1f4d6; 前言 最近成功完成了一次 Ubuntu 雙系統的完整卸載&#xff0c;從最初的分區刪除到最終解決 GRUB 引導問題&#xff0c;整個過程雖然有些曲折&#xff0c;但最終完美解決。本文將詳細分享整個卸載過程&#xff0c;希望能幫助到有類似需求的朋友。 &#x1f3af…

深入理解oracle ADG和RAC

1. 引言 本節詳細介紹oracle ADG和RAC。當然這里講得的詳細是相對理論的深入&#xff0c;不涉及到實驗&#xff0c;比如ADG和RAC的搭建及調優等。 RAC (Real Application Clusters) 和 ADG (Active Data Guard)是Oracle 的兩大核心高可用和災備技術。它們是 Oracle 數據庫高可用…

網絡安全實踐:從環境搭建到漏洞復現

要求&#xff1a;1.搭建docker2.使用小皮面板搭建pikachu靶場3.使用BP的爆破模塊破解pikachu的登陸密碼步驟4.Kail的msf復現永恒之藍一.搭建docker1. Docker介紹Docker 是容器&#xff0c;可以部分完全封閉。封閉意味&#xff1a;一個物質&#xff08;放到容器&#xff09;&…

車載診斷架構 --- 診斷功能開發流程

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

mysql數據庫知識

MySQL數據庫詳解MySQL是目前全球最流行的關系型數據庫管理系統之一&#xff0c;以其開源免費、高效穩定、易于擴展等特點&#xff0c;被廣泛應用于Web開發、企業級應用等場景。本文將從基礎概念、核心特性到實際應用&#xff0c;對MySQL進行全面解析。一、MySQL的基本概念1. 關…

基于springboot的美食文化和旅游推廣系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Rust賦能文心大模型4.5智能開發

文心大模型4.5版本概論 文心大模型4.5是百度推出的最新一代大規模預訓練語言模型,屬于文心大模型(ERNIE)系列。該模型在自然語言處理(NLP)、多模態理解與生成等領域表現出色,廣泛應用于智能搜索、內容創作、對話交互等場景。 核心能力 語言理解與生成 支持復雜語義理解…

前端抓包(不啟動前端項目就能進行后端調試)--whistle

1、安裝 1.1.安裝node.js 1.2.安裝whistle npm install -g whistle2.安裝瀏覽器插件【SwitchyOmega】在谷歌瀏覽器應用商店下載安裝即可配置proxy127.0.0.1:8989是w2 start的端口號啟用代理3.啟動服務&#xff08;每次抓包都得啟動&#xff09; w2 start點擊鏈接訪問網頁 http:…