Springboot原理探究

SpringBoot运行原理

原理初探:

自动装配:

pom.xml

  • spring-boot-dependencies:核心依赖,该依赖在父工程
  • 我们在写或者引入Springboot依赖的时候,不需要指定版本是因为这些都存在于版本仓库中

启动器

  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
  • 启动器:就是Springboot的启动场景

  • 比如我们导入的web依赖(spring-boot-starter-web),那么他就会自动帮我们导入web需要的所有依赖

  • Springboot会将所有的功能场景都变成一个个的启动器

主程序

//@SpringBootApplication:标注该类是一个Springboot应用,并将启动类下的所有资源导入
@SpringBootApplication
public class SpringbootHelloworldApplication {

    public static void main(String[] args) {
        //启动Springboot应用
        SpringApplication.run(SpringbootHelloworldApplication.class, args);
    }
}
  • 注解

    • @SpringBootConfiguration:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;

      ​ @Configuration:spring配置类

      ​ @Component:spring的一个组件,负责启动应用

    • @EnableAutoConfiguration:开启自动配置功能

      ​ @AutoConfigurationPackage:自动配置包

      ​ @Import({AutoConfigurationImportSelector.class}):自动配置中的包注册,给容器导入组件

      ​ @Import({AutoConfigurationImportSelector.class}):AutoConfigurationImportSelector自动配置导入选择器

    • @ComponentScan:这个注解在Spring中很重要 ,它对应XML配置中的元素。

      作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中

    • 获取所有的配置和候选配置

      //获取所有配置
      List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
      
      /**
      	获取候选配置,getCandidateConfigurations类会去加载一个getSpringFactoriesLoaderFactoryClass类,而该类调用了EnableAutoConfiguration.class,这就是注解@EnableAutoConfiguration的原理
      */
      protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
      		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
      				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;
      	}
      

在这里插入图片描述

META-INF/spring.factories:自动配置的核心文件
在这里插入图片描述

所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
在这里插入图片描述
结论:springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories,所有的自动配置类都在这里面,但是配置不一定生效,因此我们要条件判断是否成立,只要导入了对应的start(jar包),就有对应的启动器,那么自动装配就会生效,即配置成功。

springboot运行原理大概步骤:

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

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

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

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

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

主启动类

默认主启动类:不仅仅是运行了一个main方法,更重要的是它开启了一个服务

//@SpringBootApplication:标注该类是一个Springboot应用
@SpringBootApplication
public class SpringbootHelloworldApplication {

    public static void main(String[] args) {
        //启动Springboot应用
        SpringApplication.run(SpringbootHelloworldApplication.class, args);
    }
}

SpringApplication.run分析

SpringApplication

这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

好的,我们查看一下他的构造器里面有什么???


public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
    // ......
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    this.setInitializers(this.getSpringFactoriesInstances();
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = this.deduceMainApplicationClass();
}

重点:

run方法的流程分析

在这里插入图片描述
注:本文章内容部分来自blog.kuangstudy.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值