SpringBoot运行原理

目录

@SpringBootApplication

@ComponentScan

@SpringBootConfiguration

@EnableAutoConfiguration

结论


@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. 将这些值作为自动配置类导入容器 , 自动配置类就生效 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值