springboot之自動(dòng)裝配全過程
Spring Boot 實(shí)現(xiàn)自動(dòng)裝配的關(guān)鍵在于其自動(dòng)配置機(jī)制(Auto-Configuration)和基于注解的配置。以下是 Spring Boot 實(shí)現(xiàn)自動(dòng)裝配的主要原理和步驟:
1. @SpringBootApplication 注解
@SpringBootApplication
是一個(gè)組合注解,它包含了三個(gè)重要的注解:@EnableAutoConfiguration
、@ComponentScan
和 @Configuration
。
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
@EnableAutoConfiguration
:?jiǎn)⒂?Spring Boot 的自動(dòng)配置機(jī)制。@ComponentScan
:?jiǎn)⒂媒M件掃描,以便找到帶有@Component
、@Service
、@Repository
、@Controller
等注解的 Spring 組件。@Configuration
:表明這個(gè)類是一個(gè)配置類,可以包含@Bean
定義。
2. 自動(dòng)配置(Auto-Configuration)
@EnableAutoConfiguration
注解觸發(fā)自動(dòng)配置。
Spring Boot 會(huì)根據(jù)類路徑中的依賴、屬性文件中的配置以及其他環(huán)境變量來判斷并自動(dòng)配置應(yīng)用所需的 Bean。
自動(dòng)配置的實(shí)現(xiàn)原理
Spring Boot 的自動(dòng)配置機(jī)制依賴于 spring.factories
文件,該文件位于 META-INF
目錄下。
這個(gè)文件列出了所有的自動(dòng)配置類(Auto-Configuration Classes)。
例如,Spring Boot 的 spring-boot-autoconfigure
JAR 包中的 spring.factories
文件部分內(nèi)容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ ...
這些自動(dòng)配置類會(huì)在 Spring 應(yīng)用上下文初始化時(shí)被加載,并根據(jù)條件自動(dòng)配置相應(yīng)的 Bean。
3. 條件裝配
自動(dòng)配置類通常使用條件注解(Conditional Annotations)來控制 Bean 的裝配。這些注解包括:
@ConditionalOnClass
:只有在指定的類在類路徑上存在時(shí)才會(huì)裝配 Bean。@ConditionalOnMissingBean
:只有在指定的 Bean 不存在時(shí)才會(huì)裝配 Bean。@ConditionalOnProperty
:只有在指定的屬性存在并具有特定值時(shí)才會(huì)裝配 Bean。
例如,DataSourceAutoConfiguration
類:
@Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMissingBean(DataSource.class) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean public DataSource dataSource(DataSourceProperties properties) { // 配置和創(chuàng)建 DataSource return properties.initializeDataSourceBuilder().build(); } }
4. 組件掃描(Component Scan)
@ComponentScan
注解啟用組件掃描,Spring 會(huì)掃描指定包及其子包中的所有組件(帶有 @Component
、@Service
、@Repository
、@Controller
等注解的類),并將它們注冊(cè)為 Spring Bean。
@SpringBootApplication @ComponentScan(basePackages = "com.example.myapp") public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
5. 配置類(Configuration Class)
@Configuration
注解用于定義配置類,這些類可以包含一個(gè)或多個(gè) @Bean
方法。
每個(gè) @Bean
方法定義了一個(gè) Bean,并將其注冊(cè)到 Spring 應(yīng)用上下文中。
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } }
6. 使用 @Autowired 注入依賴
Spring 通過 @Autowired
注解實(shí)現(xiàn)依賴注入。
@Autowired
可以應(yīng)用于構(gòu)造器、方法和字段,Spring 會(huì)自動(dòng)注入相應(yīng)的 Bean。
@Service public class MyService { private final MyRepository myRepository; @Autowired public MyService(MyRepository myRepository) { this.myRepository = myRepository; } // 或者通過字段注入 @Autowired private MyRepository myRepository; }
總結(jié)
Spring Boot 通過一系列注解和條件配置實(shí)現(xiàn)了自動(dòng)裝配機(jī)制,使得開發(fā)者無需手動(dòng)配置大量的 XML 文件或 Java 配置類。
自動(dòng)配置機(jī)制利用 spring.factories
文件中的自動(dòng)配置類,并結(jié)合條件注解和組件掃描,實(shí)現(xiàn)了靈活且強(qiáng)大的自動(dòng)裝配功能。
這樣,開發(fā)者可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而無需處理繁瑣的配置細(xì)節(jié)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java對(duì)象數(shù)組的添加、刪除和遍歷代碼示例
在Java編程中,我們經(jīng)常需要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對(duì)象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下2024-04-04一文帶你吃透JSP增刪改查實(shí)戰(zhàn)案例詳細(xì)解讀
這篇文章主要為大家詳細(xì)介紹了JSP中增刪改查實(shí)戰(zhàn)案例的相關(guān)知識(shí),文中的示例代碼講解現(xiàn)象,具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-03-03Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼
這篇文章主要介紹了Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01解決SpringMVC接收不到ajaxPOST參數(shù)的問題
今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Java switch 語句如何使用 String 參數(shù)
這篇文章主要介紹了Java switch 語句如何使用 String 參數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06Java正則表達(dá)式實(shí)現(xiàn)在文本中匹配查找換行符的方法【經(jīng)典實(shí)例】
這篇文章主要介紹了Java正則表達(dá)式實(shí)現(xiàn)在文本中匹配查找換行符的方法,結(jié)合具體實(shí)例分析了java正則匹配查找換行符的實(shí)現(xiàn)技巧與匹配模式相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-04-04Java中各類日期和時(shí)間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)
這篇文章主要介紹了Java中日期和時(shí)間處理的幾個(gè)階段,包括java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar和java.util.GregorianCalendar等類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之微信獲取用戶基本信息
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之微信獲取用戶基本信息 的相關(guān)資料,需要的朋友可以參考下2015-12-12