Spring Boot 原理<1>

在公司使用SSM作了若干個項目,新的項目基本上就是Ctrl+c原來配置。後來公司「緊跟潮流」後面項目改用Spring Boot,因爲封裝嚴重,有時出了問題網上都找不到解解決方案,仍是乖乖本身捋一捋Spring Boot吧!java

Spring Boot是什麼

官網解釋以下

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".spring

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.springboot

Spring Boot的核心是基於Spring構建的,官方對Spring Boot的定位是Build Anything,旨在快速、高效,使用最少的配置構建Java應用。app

  • Spring Cloud—————————Coordinate Anything (協調任何東西)
  • Spring Cloud Data Flow—————Connect Everything (鏈接任何東西)

Spring Boot原理

啓動類以下

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

SpringApplication是什麼類?@SpringBootApplication又是什麼?點擊到源碼:ide

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
複製代碼
  • @Target(ElementType.TYPE) // 註解的適用範圍
  • @Retention(RetentionPolicy.RUNTIME) // 註解的生命週期
  • @Documented // 代表這個註解應該被javadoc記錄
  • @Inherited // 子類能夠繼承該註解
  • @SpringBootConfiguration //代表某個類是springboot的配置類 底層是 @Configration ,自己其實也是一個IoC容器的配置類
  • @ComponentScan //自動掃描並加載符合條件的組件 ,好比@Component和@Repository加載到IoC容器中。
  • @EnableAutoConfiguration開啓自動配置功能。

@EnableAutoConfiguration

@EnableAutoConfiguration對啓動有相當重要的做用,也是一個複合註解。源碼以下:ui

@Target({ElementType.TYPE})
@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:自動配置包
  • Import(AutoConfigurationImportSelector.class)註解

經過源碼發現:@EnableAutoConfiguration也是藉助@Import將全部符合自動配置條件的bean定義加載到IoC容器。this

@AutoConfigurationPackage也是一個複合式註解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
複製代碼

AutoConfigurationImportSelector核心方法爲selectImports:s

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                .loadMetadata(this.beanClassLoader);
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations = getCandidateConfigurations(annotationMetadata,
                attributes);
        configurations = removeDuplicates(configurations);
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return StringUtils.toStringArray(configurations);
    }
複製代碼

藉助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration能夠將全部符合條件的配置都加載到當前IoC容器spa

相關文章
相關標籤/搜索