栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot启动原理(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot启动原理(一)

    原文出处:Springboot 启动原理详细解析 - jstarseven - 博客园

    开发任何一个SpringBoot项目,都需要一个启动类

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

        @SpringBootApplication是一个组合注解,其中最重要的分别是:@SpringBootConfiguration(本质上是一个@Configuration)、@EnableAutoConfiguration、@ComponentScan。

即@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan

1、@Configuration

        它就是JavaConfig形式下的那个@Configuration,所以,这个启动类本质上也是一个Spring的IOC容器配置类

        JavaConfig配置下的两个注解:参考XML配置与Java配置_m0_50043893的博客-CSDN博客

2、@ComponentScan

        @ComponentScan注解的作用是自动扫描并加载符合条件的组件或者bean,并将他们加载到IOC容器中

        我们可以通过注解里包含的basePackages等属性来定制扫描的范围,如果不指定,则默认从声明@ComponentScan所在类的package里面找。

        所以,SpringBoot启动类最好放在根目录下。

3、@EnableAutoConfiguation

        Spring也提供了其他Enable开头的注解,例如@EnableCaching

        @EnableAutoConfiguration简单概括就是借助@import,收集和注册特定场景相关的bean定义

        @EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
@AutoConfigurationPackage
@import(EnableAutoConfigurationimportSelector.class)
public @interface EnableAutoConfiguration {
    ...
}

        @EnableAutoConfiguration作为一个复合注解,其中最关键的注解为@import(EnableAutoConfigurationimportSelector.class),它借助于Spring原有的工具类SpringFactoriesLoader,可以帮助SpringBoot将所有符合条件的@Configuration配置都添加到当前SpringBoot创建并使用的IOC容器。

自动配置幕后英雄:SpringFactoriesLoader详解

SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件meta-INF/spring.factories加载配置。

public abstract class SpringFactoriesLoader {
    //...
    public static  List loadFactories(Class factoryClass, ClassLoader classLoader) {
        ...
    }


    public static List loadFactoryNames(Class factoryClass, ClassLoader classLoader) {
        ....
    }
}

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

上图就是从SpringBoot的autoconfigure依赖包中的meta-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。

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

结论:

  1. SpringBoot在启动的时候从类路径下的meta-INF/spring.factories中获取EnableAutoConfiguration指定的值

  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号