SpringBoot啟動原理解析


1. 啟動任何一個Spring Boot項目,都會用到如下類

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

  

 從上面代碼可以看出,Annotation定義@SpringBootApplication和類定義SpringApplication.run是關鍵所在.

 

2. @SpringBootApplication

點開@SpringBootApplication我們可以看到,如下信息:

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication{
...
}

  

其實最重要的還是上面三個Annotation

 

 

3. @Configuration

它就是JavaConfig形式的Spring IOC容器的配置類使用的那個@Configuration.

Spring IOC容器配置類,基於XML配置的方式是這樣的:

<bean id="mockService" class="..MockServiceImpl">
    ...
</bean>

  

而基於Javaconfig的配置形式是這樣的:

@Configuration
public class MockConfiguration{
    @Bean
    public MockService mockService(){
        return new MockServiceImpl();
    }
}

 

任何一個標注了@Bean的方法,其返回值將作為一個bean定義注冊到Spring的IoC容器,方法名將默認成該bean定義的id.

 

4. @ComponentScan

它的功能其實就是自動掃描符合條件的組件(@Component和@Repository等)或者bean自定義,並加載到IOC容器中.

我們可以通過basePackage等屬性來細粒度的定制@ComponentScan自動掃描的范圍,如果不指定,則默認從Spring框架實現會從聲明@ComponentScan所在類的package進行掃描.

所以SpringBoot的啟動類最好是放在root package下,因為默認不指定basePackage.

 

5. @EnableAutoConfiguration

首先@Enable*的原理都是借助@Import的支持,收集和注冊特定場景相關的Bean定義,比如@EnableScheduling是通過@Import將Spring調度框架相關的bean定義都加在到IOC容器中.

 

其次,@EnableAutoConfiguration作為一個復合Annotation,其自身定義信息如下:

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    ...
}

 

借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IOC容器.

 

自動配置的幕后英雄:SpringFactoriesLoader:

SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置.

public abstract class SpringFactoriesLoader {
    //...
    public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
        ...
    }


    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        ....
    }
}

配合@EnableAutoConfiguration使用的話,它更多是提供一種配置查找的功能支持,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作為查找的Key,獲取對應的一組@Configuration類.

 

所以, EnableAutoConfiguration自動配置的魔法騎士就變成了:SpringFactoriesLoader從classpath中搜尋所有的META-INF/spring.factories配置文件,並將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的IoC容器配置類,然后匯總為一個並加載到IoC容器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM