zoukankan      html  css  js  c++  java
  • SpringBoot启动原理解析

    1. 启动任何一个Spring Boot项目,都会用到如下类

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

      

     从上面代码可以看出,Annotation定义@SpringBootApplication和类定义SpringApplication.run是关键所在.

    2. @SpringBootApplication

    点开@SpringBootApplication我们可以看到,如下信息:

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

      

    其实最重要的还是上面三个Annotation

    3. @Configuration

    它就是JavaConfig形式的Spring IOC容器的配置类使用的那个@Configuration.

    Spring IOC容器配置类,基于XML配置的方式是这样的:

    <bean id="mockService" class="..MockServiceImpl">
        ...
    </bean>
    

      

    而基于Javaconfig的配置形式是这样的:

    @Configuration
    public class MockConfiguration{
        @Bean
        public MockService mockService(){
            return new MockServiceImpl();
        }
    }
    

     

    任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id.

    4. @ComponentScan

    它的功能其实就是自动扫描符合条件的组件(@Component和@Repository等)或者bean自定义,并加载到IOC容器中.

    我们可以通过basePackage等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认从Spring框架实现会从声明@ComponentScan所在类的package进行扫描.

    所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackage.

    5. @EnableAutoConfiguration

    首先@Enable*的原理都是借助@Import的支持,收集和注册特定场景相关的Bean定义,比如@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加在到IOC容器中.

    其次,@EnableAutoConfiguration作为一个复合Annotation,其自身定义信息如下:

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

    借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器.

    自动配置的幕后英雄:SpringFactoriesLoader:

    SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件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) {
            ....
        }
    }
    

    配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类.

    所以, EnableAutoConfiguration自动配置的魔法骑士就变成了:SpringFactoriesLoader从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

  • 相关阅读:
    http返回码
    JAVA获取当前系统时间System.currentTimeMillis()以及获取运行时间
    【Jsoup】Jsoup解析Html标签(Java后台解析)
    字节、字、位、比特,这四者之间的关系
    Java中字符编码和字符串所占字节数 .
    判断一个字符串是否为全英文的工具
    汉语转拼音(全转与只转首个字母)工具类
    Page的生命周期及相关事件苛
    PHP设计模式——策略模式
    java生产者消费者问题代码分析
  • 原文地址:https://www.cnblogs.com/fengze/p/8320693.html
Copyright © 2011-2022 走看看