一篇學會SpringBoot的核心內(nèi)容之自動裝配
不面試不知道,現(xiàn)在面試的問題真的是五花八門的,最近就有讀者說,在面試的過程中,面試官還提到了關于最初版本的 Spring 還有 SpringMVC 以及現(xiàn)在的 SpringBoot 中的一些相關問題,比如他提到了這個 SpringBoot 的自動裝配是什么,你是怎么理解的,今天了不起就和大家一起來看看這個關于 SpringBoot 的自動裝配。
SpringBoot裝配機制
SpringBoot的自動裝配是一種機制,它可以幫助開發(fā)者更快地搭建和運行Spring應用。SpringBoot的自動裝配依賴于其提供的starter依賴,這些starter依賴包含了Spring應用所需的大部分配置,使得開發(fā)者不需要手動配置這些通用的功能。
如果我們這么回答,可能面試官聽到就不是很滿意了,這時候,我們就得抓住要點來進行分析,這樣回答的時候,勢必肯定能抓到重點,畢竟面試的時候,每個人的回答肯定也都是不一樣的。
1.約定優(yōu)于配置
2.核心注解
3.自動掃描
我們來一個一個的解釋這些內(nèi)容指的到底是什么意思:
約定優(yōu)于配置
SpringBoot的約定優(yōu)于配置(Convention Over Configuration)主要體現(xiàn)在以下幾個方面:
自動配置:SpringBoot根據(jù)項目的類路徑下的jar包依賴關系,自動配置相應的Bean。例如,當檢測到HSQLDB數(shù)據(jù)庫驅(qū)動在類路徑下時,它會自動配置一個嵌入式數(shù)據(jù)庫實例和相關的JPA/Hibernate設置。
目錄結構約定:SpringBoot遵循一定的目錄結構約定,使得開發(fā)者可以將代碼和資源放在約定的目錄下,而不需要在配置文件中指定。例如,靜態(tài)資源默認放在src/main/resources/static或src/main/resources/public目錄下,模板文件默認在src/main/resources/templates下。
Starter依賴:SpringBoot提供了一系列的Starter依賴,這些Starter依賴是預定義的依賴集合。通過引入相應的Starter依賴,可以自動引入相關的庫和默認配置,從而簡化了項目的依賴管理。例如,通過引入spring-boot-starter-web依賴,就能夠快速搭建一個基于Spring MVC的Web應用。
核心注解EnableAutoConfiguration
EnableAutoConfiguration 是 Spring Boot 的核心注解之一,它告訴 Spring Boot 根據(jù)你添加的 jar 依賴項自動配置你的應用程序。Spring Boot 會自動配置許多方面,例如數(shù)據(jù)源、消息代理、安全設置等,你通常不需要手動設置它們。
這個注解的工作原理是基于在項目的類路徑(classpath)中查找特定的 jar 依賴項。一旦找到這些依賴項,Spring Boot 就會自動配置相關的 bean。這減少了大量手動配置和樣板代碼的需求,使開發(fā)者能夠?qū)W⒂谒麄兊膽贸绦蜻壿嫛?/p>
@EnableAutoConfiguration 注解通常放在主應用程序類上,這是帶有 main 方法的類,該類使用 SpringApplication.run() 方法啟動 Spring Boot 應用程序。
這里是 @EnableAutoConfiguration 注解的基本用法:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
在這個例子中,@EnableAutoConfiguration 注解啟動了自動配置。Spring Boot 會根據(jù)類路徑中的 jar 依賴項來自動配置 bean。
那么EnableAutoConfiguration 是如何工作的呢?
@EnableAutoConfiguration 注解實際上是一個組合注解,它包含了 @AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class)。
@AutoConfigurationPackage 注解確保 @Configuration 類(通常位于主應用程序類中)被考慮在內(nèi),以便它可以被自動配置的 beans 使用。@Import(AutoConfigurationImportSelector.class) 注解告訴 Spring Boot 從 META-INF/spring.factories 配置文件中加載 auto-configuration 類。Spring Boot 提供了許多這樣的配置文件,每個文件都針對特定的技術或功能(如數(shù)據(jù)源、Web MVC 等)。當 Spring Boot 啟動時,它會加載 META-INF/spring.factories 配置文件,并根據(jù)你的類路徑中的依賴項選擇適當?shù)淖詣优渲妙?。然后,這些自動配置類會注冊額外的 beans 到 Spring 的上下文中。
如果你不想使用某個特定的自動配置,你可以使用 @EnableAutoConfiguration 注解的 exclude 屬性來排除它。
比如我們排除某個特定的自動配置
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
總之,@EnableAutoConfiguration 注解是 Spring Boot 的核心特性之一,它簡化了 Spring 應用程序的配置過程,使開發(fā)者能夠?qū)W⒂趯崿F(xiàn)業(yè)務邏輯。
自動掃描
Spring Boot 的自動掃描是 Spring 框架的一個特性,在 Spring Boot 中得到了進一步的簡化和增強。它允許 Spring Boot 應用程序自動發(fā)現(xiàn)和注冊 bean,減少了開發(fā)者需要手動配置和聲明 bean 的數(shù)量。
那自動掃描都做了哪些事情呢?
組件掃描:默認情況下,Spring Boot 會掃描啟動類(通常是帶有 @SpringBootApplication 注解的類)所在的包以及其子包下的所有類。它會查找?guī)в?@Component、@Service、@Repository 和 @Controller 等注解的類,并將它們作為 Spring 容器中的 bean 進行注冊。
配置類掃描:除了普通的組件,Spring Boot 還會掃描 @Configuration 注解的類,這些類通常包含 @Bean 方法定義,用于聲明和配置額外的 bean。
自動配置類掃描:Spring Boot 還會掃描 META-INF/spring.factories 配置文件,以加載和應用自動配置類。這些自動配置類通常根據(jù)類路徑下的庫和依賴項來提供默認的配置。
資源掃描:除了組件和配置類,Spring Boot 還會自動掃描靜態(tài)資源,如 HTML、CSS、JavaScript 文件以及模板文件(如 Thymeleaf、FreeMarker 等)。這些資源通常放在特定的目錄下,如 src/main/resources/static 或 src/main/resources/templates。
要開啟或調(diào)整組件掃描的范圍,你可以使用 @ComponentScan 注解。
這個注解我們都不用多說了把,指明掃包路徑
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = "com.example.myapp") // 指定掃描的包路徑
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}