首先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();}
}
痛點總結:
- 配置繁瑣:大量的 Bean(如數據源、事務管理器、視圖解析器)需要你像搭積木一樣手動配置。
- 需要明確指定掃描路徑:
@ComponentScan
或<context:component-scan>
必須明確告訴 Spring 去哪里找你的 Bean。 - 依賴管理復雜:你需要手動管理一大堆
spring-core
,spring-web
,spring-webmvc
等 jar 包,并確保它們的版本相互兼容,這簡直是噩夢。 - 需要手動啟動:啟動容器的代碼是樣板化的,但每個項目都得寫一遍。
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 配置的最大簡化。自動配置的工作原理是:
- 偵測 Classpath:Spring Boot 檢查你的項目中引入了哪些 Starters 和庫。
- 條件化配置:它內部有大量的
@ConditionalOnClass
,@ConditionalOnBean
等條件注解。- 例如:當它發現你的 classpath 中有
tomcat-embedded.jar
時(由starter-web
引入),它就自動為你配置好一個嵌入式的 Tomcat 服務器 Bean。 - 又例如:當它發現 classpath 中有
DataSource.class
并且你沒有手動配置一個DataSource
Bean 時,它就會嘗試讀取application.properties
文件中的spring.datasource.*
屬性,并自動為你創建一個DataSource
Bean。
- 例如:當它發現你的 classpath 中有
所以,之前你需要手動配置的 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 容器穿上了一件極其智能的“自動化裝甲”。它將業界沉淀下來的實踐固化為“約定”和“自動配置”,讓開發者從繁瑣的配置工作中徹底解放,真正做到“開箱即用”,讓開發者專注于業務邏輯的實現。