• SpringBoot运行原理


    目录

    @SpringBootApplication

    @ComponentScan

    @SpringBootConfiguration

    @EnableAutoConfiguration

    结论


    @SpringbootApplication(主入口)

    1. @SpringBootApplication
    2. public class SpringbootConfigApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(SpringbootConfigApplication.class, args);
    5. }
    6. }

    @SpringBootApplication

    标注在某个类上说明是springboot的主启动类,springboot运行这个类的main方法来启动springboot应用。是springboot的核心配置文件,其中包含

    @SpringBootConfiguration

    @EnableAutoConfiguration

    @ComponentScan

    @ComponentScan

    自动扫描并加载符合条件的组件或bean,对应原先XML中的元素,将bean注入IOC容器中

    @SpringBootConfiguration

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Configuration
    5. @Indexed
    6. public @interface SpringBootConfiguration {
    7. @AliasFor(
    8. annotation = Configuration.class
    9. )
    10. boolean proxyBeanMethods() default true;
    11. }

     作用:标注在某个类上,就作为springboot的配置类,点击Configuration继续进入注解。

    1. // 点进去得到下面的 @Component
    2. @Configuration
    3. public @interface SpringBootConfiguration {}
    4. @Component
    5. public @interface Configuration {}
    1. 有Component组件说明他还是spring的一个组件,负责启动应用
    2. @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件

    @EnableAutoConfiguration

     @EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效

    1.AutoConfigurationPackage:自动配置包

    1. @Import({Registrar.class})
    2. public @interface AutoConfigurationPackage {
    3. }

            1.1 @Import导入一个容器组件

            1.2 Registrar.class:将启动类同级下的包和他的子包都加载到spring容器中

    2.@Import({AutoConfigurationImportSelector.class}):给容器导入组件

    点击源码进入AutoConfigurationImportSelector:

    • 该类中有一个方法叫做getCandidateConfigurations
    1. // 获得候选的配置
    2. protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    3. //这里的getSpringFactoriesLoaderFactoryClass()方法
    4. //返回的就是我们最开始看的启动自动导入配置文件的注解类;EnableAutoConfiguration
    5. List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    6. 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.");
    7. return configurations;
    8. }
    • 该方法又调用了SpringFactoriesLoader中的静态方法
    1. public static List loadFactoryNames(Class factoryClass, @Nullable ClassLoader classLoader) {
    2. String factoryClassName = factoryClass.getName();
    3. //这里它又调用了 loadSpringFactories 方法
    4. return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
    5. }
    • 再次进入loadSpringFactories 方法
    Enumeration urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
    • 多次出现spring.factories

    • 我们根据源头打开spring.factories , 看到了很多自动配置的文件;这就是自动配置根源所在! 

    结论

    1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

    2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 

  • 相关阅读:
    【产品应用】一体化伺服电机在系留无人机中的应用
    【数据结构】堆,堆的实现,堆排序,TOP-K问题
    5.3-5.4二分搜索算法实例
    总结html5中常见的选择器
    总监调岗至前台,企业被判赔偿26万,法院:“侮辱性调岗”违法
    java Suspicious regex expression "." in call to 'replaceAll()' 问题延展
    java毕业设计网站基于JSP的在线调查问卷系统|投票[包运行成功]
    java计算机毕业设计-智慧农业水果销售系统MyBatis+系统+LW文档+源码+调试部署
    N-FX2-4 移动链表节点
    ABP处理非结构化数据的方式:分布式文件系统minio
  • 原文地址:https://blog.csdn.net/weixin_64704029/article/details/132890765