Spring Boot @SpringBootApplication原理

启动类注解@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan

@Target({ElementType.TYPE}) // 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME)// 注解的生命周期,保留到class文件中(三个生命周期)
@Documented                       // 表明这个注解应该被javadoc记录
@Inherited                        // 子类可以继承该注解
@SpringBootConfiguration          // 继承了Configuration,表示当前是注解类
@EnableAutoConfiguration          // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan( // 扫描路径设置
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    ......
}

@Configuration

标明该类使用Spring基于Java的配置。虽然本书不会写太多配置,但我们会更倾向于使用基于Java而不是XML的配

置。

@EnableAutoConfiguration

Spring Boot 的@EnableAutoConfiguration : 这个不起眼的小注解也可以称为@Abracadabra(咒语),就是这一

行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。简单概括一下就是,借助@Import的支

持,将所有符合自动配置条件的bean定义加载到IoC容器。

@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 {};
}

@ComponentScan

Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为

Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC控制器,使用@Controller进行注解,这

样组件扫描才能找到它。

自动配置幕后英雄:SpringFactoriesLoader

借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!

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) {
....
}
}
posted on 2022-09-06 09:02  小熊学Java  阅读(34)  评论(0编辑  收藏  举报