首页 > 编程语言 > 详细

SpringBoot启动过程

时间:2019-05-15 17:20:13      阅读:124      评论:0      收藏:0      [点我收藏+]

一 启动过程

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

启动类使用了注解SpringBootApplication,而事实上,该注解是一个组合注解

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication

SpringBootApplication= SpringBootConfiguration + EnableAutoConfiguration + ComponentScan

  • SpringBootConfiguration:配置类

  • EnableAutoConfiguration:能够实现自动配置的灵魂所在
  • ComponentScan:用注解实现自动扫描,默认扫描当前包与子包,?@Filter是排除两个类

1 SpringBootConfiguration

基本上该注解的功能类似于 @Configuration,主要功能是标注当前类是一个配置类,该类会声明一个或者多个@Bean并注入到Spring容器当中

2 EnableAutoConfiguration

该注解是SpringBootApplication能够自动进行配置的关键所在,在Spring框架下的所有@Enable样式的Annotation其做事的理念和方式是一脉相承的的。简单开阔一下就是,借助@Import进行收集和注册特定场景相关的@Bean。

其中Import关键字的意义是

  1. 声明一个bean
  2. 导入@Configuration注解的配置类
  3. 导入ImportSelector的实现类
  4. 导入ImportBeanDefinitionRegister的实现类

EnableAutoConfiguration的本质功能就是通过@Import,将所有符合自动配置的@Bean加载到IoC容器当中

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

}

其中@Import注解导入了EnableAutoConfigurationImportSelector类,其作用是当容器刷新时,调用AutoConfigurationImportSelector类的selectImports方法,将SpringBoot应用所有满足符合条件的@Configuration配置都自动加载到当前 IoC容器当中

技术分享图片

这里可以看到,本质上真正的自动配置的核心类是SpringFactoriesLoader。该类的主要做用是从指定的配置文件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) {
      ....
  }
}  

3ComponentScan

SpringBoot启动过程

原文:https://www.cnblogs.com/aguai1992/p/10870697.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!