SpringBoot自動(dòng)配置與啟動(dòng)流程詳細(xì)分析
一、自動(dòng)配置
主啟動(dòng)類
//@SpringBootApplication 來標(biāo)注一個(gè)主程序類
//說明這是一個(gè)Spring Boot應(yīng)用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以為是啟動(dòng)了一個(gè)方法,沒想到啟動(dòng)了一個(gè)服務(wù)
SpringApplication.run(SpringbootApplication.class, args);
}
}@SpringBootApplocation注解內(nèi)部
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// ......
}1. @ComponentScan
這個(gè)注解在Spring中很重要,它對應(yīng)XML配置中的元素。
作用:自動(dòng)掃描并加載符合條件的組件或者bean,將這個(gè)bean定義加載到IOC容器中。
2. @SpringBootConfiguration
作用:SpringBoot的配置類,標(biāo)注在某個(gè)類上,表示這是一個(gè)SpringBoot的配置類;
@Configuration 作用:允許在上下文中注冊額外的bean或倒入其他配置類
//@SpringBootConfiguration注解內(nèi)部
//這里的 @Configuration,說明這是一個(gè)配置類 ,配置類就是對應(yīng)Spring的xml 配置文件;
@Configuration
public @interface SpringBootConfiguration {}
//里面的 @Component 這就說明,啟動(dòng)類本身也是Spring中的一個(gè)組件而已,負(fù)責(zé)啟動(dòng)應(yīng)用
@Component
public @interface Configuration {}3. @EnableAutoConfigeration
作用:啟用SpringBoot的自動(dòng)配置機(jī)制
import java.lang.annotation. Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
@Target({ElementTypeTYPE})
@Retention(RetentionPolicy.RUNTIME)@Documented
@Inherited
@AutoconfigurationPackage
@Import( {AutoconfigurationImportselector.class})
public @interface EnableAutoconfiguration{
string ENABLED_OVERRIDE_PROPERTY ="spring.boot.enableautoconfiguration" ;
class<?>[]exclude() default {};
string[ ] excludeName( ) default {};
}
@AutoConfigurationPackage :自動(dòng)配置包
//AutoConfigurationPackage的子注解
//Registrar.class 作用:將主啟動(dòng)類的所在包及包下面所有子包里面的所有組件掃描到Spring容器
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}@EnableAutoConfigeration 注解通過Spring提供的 @Import 注解導(dǎo)入了 AutoConfigurationImportSelector 類; AutoConfigurationImportSelector 類中 getCandidateConfigurations 方法會(huì)將所有自動(dòng)配置類的信息以List的形式返回,這些配置信息會(huì)被Spring容器作Bean來管理。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
}4. @Condition
在Spring 4.0 增加的條件判斷功能,通過這個(gè)可以功能可以實(shí)現(xiàn)選擇性的創(chuàng)建 Bean 操作。
- ConditionalOnProperty:判斷配置文件中是否有對應(yīng)屬性和值才初始化Bean
- ConditionalOnClass:判斷環(huán)境中是否有對應(yīng)字節(jié)碼文件才初始化Bean
- ConditionalOnMissingBean:判斷環(huán)境中沒有對應(yīng)Bean才初始化Bean
- ConditionalOnBean:判斷環(huán)境中有對應(yīng)Bean才初始化Bean
以上注解在springBoot-autoconfigure的condition包下。
總結(jié)原理
- @EnableAutoConfiguration 注解內(nèi)部使用 @Import(AutoConfigurationImportSelector.class)來加載配置類;
- 配置文件位置:META-INF/spring.factories,該配置文件中定義了大量的配置類,當(dāng) SpringBoot 應(yīng)用啟動(dòng)時(shí),會(huì)自動(dòng)加載這些配置類,初始化Bean;
- 并不是所有的Bean都會(huì)被初始化,在配置類中使用Condition來加載滿足條件的Bean。
啟動(dòng)流程
- 基于SpringBoot開發(fā)的項(xiàng)目中都會(huì)有一個(gè)@SpringBootApplication注解配置的啟動(dòng)類,啟動(dòng)類中會(huì)有一個(gè)
main()方法作為啟動(dòng)入口,main()方法中調(diào)用SpringApplication.run(),開始啟動(dòng)整個(gè)SpringBoot應(yīng)用程序; - 在
SpringApplication.run()方法中,首先進(jìn)行初始化,創(chuàng)建SpringApplication對象,通過它的構(gòu)造方法,完成初始化,讀取自動(dòng)配置核心類; - 通過執(zhí)行SpringApplication對象的
run()方法,完成SpringBoot應(yīng)用程序的啟動(dòng)邏輯:啟動(dòng)流程的監(jiān)聽、配置環(huán)境、打印啟動(dòng)Banner、創(chuàng)建Spring容器、記錄啟動(dòng)時(shí)間、執(zhí)行Runner(ApplicationRunner和CommandLineRunner)等啟動(dòng)步驟。
到此這篇關(guān)于SpringBoot自動(dòng)配置與啟動(dòng)流程詳細(xì)分析的文章就介紹到這了,更多相關(guān)SpringBoot自動(dòng)配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot淺析依賴管理與自動(dòng)配置概念與使用
- SpringBoot?DataSource數(shù)據(jù)源實(shí)現(xiàn)自動(dòng)配置流程詳解
- SpringBoot自動(dòng)配置源碼深入刨析講解
- SpringBoot使用@EnableAutoConfiguration實(shí)現(xiàn)自動(dòng)配置詳解
- SpringBoot自動(dòng)配置Quartz的實(shí)現(xiàn)步驟
- springboot自動(dòng)配置原理以及spring.factories文件的作用詳解
- Springboot 如何關(guān)閉自動(dòng)配置
- springboot排除某些自動(dòng)配置的操作方法
相關(guān)文章
深入分析@Resource和@Autowired注解區(qū)別
這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)
這篇文章主要介紹了JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)的辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Spring Cloud Zuul集成Swagger實(shí)現(xiàn)過程解析
這篇文章主要介紹了Spring Cloud Zuul集成Swagger實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Java線程讓步_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級(jí)的等待線程獲取執(zhí)行權(quán)。下面通過本文給大家介紹Java線程讓步的相關(guān)知識(shí),需要的朋友參考下吧2017-05-05
SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)
FreeMarker它允許開發(fā)人員使用模板和數(shù)據(jù)來生成輸出文本,如HTML網(wǎng)頁、電子郵件、配置文件和源代碼等,本文主要介紹了SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn),感興趣的可以了解一下2024-03-03
詳解基于Spring Cloud幾行配置完成單點(diǎn)登錄開發(fā)
這篇文章主要介紹了詳解基于Spring Cloud幾行配置完成單點(diǎn)登錄開發(fā),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群的方案
Kubernetes是一個(gè)開源的容器編排平臺(tái),可以自動(dòng)化在部署、管理和擴(kuò)展容器化應(yīng)用過程中涉及的許多手動(dòng)操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群,需要的朋友可以參考下2024-08-08

