Spring Boot 注解

就 Spring Boot 启动的 SpringBootApplication 进行解释。

@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}
)}
)
  • @SpringBootApplication

    组合了 @SpringBootConfiguration@ComponentScan@EnableAutoConfiguration,是 Spring Boot 项目的入口。

    • @SpringBootConfiguration

      等同于 @Configuration

      • @Configuration

        IOC 容器的配置标签,等同于 Spring 中 的配置,@Configuration 标注的就是一个 JavaConfig 的配置类,注册 bean 需要在方法上使用 @Bean 标注

    • @EnableAutoConfiguration

      自动配置,通过 @Import 收集和注册特定场景的 bean 定义。

      • @EnableAutoConfigurationImportSelector

        搜索服务条件的 @Configuration 配置,并加载到 Spring Boot 中,创建并使用 IOC 容器。

      • SpringFactoriesLoader.java

          protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
              List 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;
          }
      

      SpringFactoriesLoader 会加载 META-INF/spring.factories 配置文件,从而加载相应类到 IOC 容器中

    • @ComponentScan

      自动扫描符合条件的组件,如 @Component@Repository 等,也可以通过指定 basePackages 来更细粒度的定制扫描范围。

    graph TD
    A[收集条件和回调接口 ApplicationIntializer/ApplicationListener] --step1 started--> B[准备 Environment]
    B -- step2 environmentPrepared--> C[初始化 ApplicationContext 设置 Enviornment]
    C -- step3 contextPrepared contextLoaded --> D[refresh context 启动完成]
    

你可能感兴趣的:(Spring Boot 注解)