zoukankan      html  css  js  c++  java
  • SpringBoot启动过程

    一 启动过程

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

    Spring的启动代码里最核心的两个部分

    • @SpringBootApplication
    • SpringApplication.run()

    二 @SpringBootApplication

    启动类使用了注解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) {
            ....
        }
    }  
    

    3 ComponentScan

    @ComponentScan会扫描指定的包路径,如果没有指定包路径,则以声明的这个注解类作为基本包路径。

  • 相关阅读:
    Java单例模式深入详解
    深入理解Java的接口和抽象类
    java中为什么要给类使用代理?它有哪些好处?
    Log4j--java日志
    Log4j rootLogger配置
    selenium之 下拉选择框Select
    关于弹框
    spring controller接口中,用pojo对象接收页面传递的参数,发现spring在对pojo对象赋值时,有一定顺序的问题
    navicat mysql报错误:2013 Lost connection to MySQL server during query
    记录一次mysql导入千万条测试数据过慢的问题!
  • 原文地址:https://www.cnblogs.com/aguai1992/p/10870697.html
Copyright © 2011-2022 走看看