0


SpringBoot运行原理

@SpringbootApplication(主入口)

@SpringBootApplication
public class SpringbootConfigApplication {

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

}

@SpringBootApplication

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

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

@ComponentScan

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

@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

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

// 点进去得到下面的 @Component
@Configuration
public @interface SpringBootConfiguration {}

@Component
public @interface Configuration {}
  1. 有Component组件说明他还是spring的一个组件,负责启动应用
  2. @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件

@EnableAutoConfiguration

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

1.AutoConfigurationPackage:自动配置包

@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
    1.1 @Import导入一个容器组件

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

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

点击源码进入AutoConfigurationImportSelector:

  • 该类中有一个方法叫做getCandidateConfigurations
// 获得候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    //这里的getSpringFactoriesLoaderFactoryClass()方法
    //返回的就是我们最开始看的启动自动导入配置文件的注解类;EnableAutoConfiguration
    List<String> 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中的静态方法
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    //这里它又调用了 loadSpringFactories 方法
    return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}
  • 再次进入loadSpringFactories 方法
Enumeration<URL> 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. 将这些值作为自动配置类导入容器 , 自动配置类就生效

标签: spring boot java spring

本文转载自: https://blog.csdn.net/weixin_64704029/article/details/132890765
版权归原作者 米兰的小铁匠~ 所有, 如有侵权,请联系我们删除。

“SpringBoot运行原理”的评论:

还没有评论