SpringBoot2学习笔记06

本文详细解析了SpringBoot2的高级特性,包括Profile环境切换、配置加载优先级和自定义starter细节。同时深入探讨了SpringApplication的创建初始化流程、完整的启动过程以及自定义事件监听组件的工作原理。通过学习,读者可以更好地理解和掌握SpringBoot的内部工作机制。
摘要由CSDN通过智能技术生成

目录

八十一、高级特性-Profile环境切换

八十二、高级特性-配置加载优先级

八十三、高级特性-自定义starter细节

八十四、原理解析-SpringApplication创建初始化流程

八十五、原理解析-SpringBoot完整启动过程

八十六、原理解析-自定义事件监听组件


八十一、高级特性-Profile环境切换

 1、Profile功能

为了方便多环节适配,springboot简化了profile功能

2、命令行激活

java -jar xxx.jar --spring.profiles.active=prod

 3、配置文件分组

# 应用名称
spring.application.name=boot-09-features-profile
# 指定激活的环境。默认配置文件和指定环境的配置文件都会生效。
spring.profiles.active=myprod
# 分组
spring.profiles.group.myprod[0]=ppd
spring.profiles.group.myprod[1]=prod

spring.profiles.group.mytest[0]=test

八十二、高级特性-配置加载优先级

八十三、高级特性-自定义starter细节

1、starter启动原理

 2、自定义starter

八十四、原理解析-SpringApplication创建初始化流程

1、SpringBoot原理,首先SpringBoot不是一个单纯的框架,它底层整合了非常多的技术,比如Spring、SpringMVC以及Spring整个系列技术栈的其它技术,甚至于第三方框架

2、需要理解Spring原理【Spring注解】,SpringMVC原理、自动配置原理、SpringBoot原理

3、前面给大家分析SpringBoot的自动配置原理,那我们接下来就来看我们整个SpringBoot应用是怎么启动起来的,它启动过程中又干了哪些活,接下来就研究一下启动原理

4、debug断点打在这里,这块启动原理,大家要额外注意一些,因为我们SpringBoot在启动整个应用的过程中,我们有非常多的时机,这些时机呢?我们有可能需要自定义干一些活,我们需要一些回调机制来完成这个事情,所以SpringBoot对底层这个能力也做了支持,所以我们在调试SpringBoot这个启动过程的时候,注意以下的这些东西,比如说有一个东西Listener(监听器)、Initializer(初始化器),它们都会在合适的时机进行回调,现在就来看一下整个启动过程。

5、我们来看一下SpringBoot应用是怎么启动的,我们已传入我们的主配置类就开始运行Spring的应用,怎么运行呢?我们step into进来,进来以后呢。它首先new Class把我们的主程序类传来,调用run方法,我们直接进入它的run方法,这个run方法呢?首先第一步会创建Spring应用,第二部把Spring的应用跑起来

 6、首先我们来分析创建SpringApplication干了什么?我们来Step into,它给我们传入的呢是主配置类,我们来step into进来,然后它调用this有参构造器,传了两个参数。我们再step into进来

 7、这个this里面呢,我们会看到初始化了很多东西,我们来往下走,这里来到SpringApplication里面的好多属性,我们要创建对象呢?这些属性先得初始化过来,我们先不管这些属性,我们再次来到下面这个类里面。首先呢,它先保存了第一个属性,this.resourceLoader(资源加载器),然后Assert.notNull('','')断言,如果没有主配置类会给你抛一个失败,然后把主配置类的信息先保存起来,在当前的SpringApplication这个类里面保存了当前主配置类是什么?(

Boot09HelloTestApplication

),当然这个主配置类里面,最核心的通过

@SpringBootApplication这个注解开启了整个自动配置功能,当然这一块我们就不用分析了。我们主配置类先记录了以后,接下来它再来在这保存了一些属性,所以呢?我们这个创建对象最核心的就是保存一些信息,这些信息包括些什么呢?

 8、我们来看一些关键的,这个信息其中里面还有一个叫webApplicationType,它来决定当前的这个应用的web应用的类型,它调用了WebApplicationType.deduceFromClasspath(),它来判断我们web应用的类型,Step into进来,看是怎么判断的。用类工具类ClassUtils,我们看源码底层的时候,会看到非常多有用的工具类,ClassUtils会先来判断当前这个系统里面有没有导入reactive,相当于响应式编程的整个请求处理器,但是呢,我们现在不是响应式编程,如果是响应式编程,我们整个应用就会返回它是一个响应式编程。而我们现在是原生的servlet编程,所以呢,接下来就会返回

WebApplicationType.SERVLET,当前web应用的类型是servlet

 9、this.bootstrappers这相当于一些初始启动器,什么叫做初始启动器呢?项目一启动我们就要干什么的,而这些初始启动器呢?它是这么来做的 getSpringFactoriesInstances 它是调用这个方法把我们这个类型传过去,在this.bootstrappers这里记录一下,它还是list,list里面都是Bootstrapper,它想要获取所有的初始化启动器,初始启动器是什么?我们看它是怎么获取的,step into进来

private List<Bootstrapper> bootstrappers;

10、它调用getSpringFactoriesInstances这个方法获取的,我们再来点进来,它相当于想要获取这个Bootstrapper,我们再step into进来。

它先拿到类加载器,然后呢使用一个SpringFactoriesLoader,这个东西呢,我们以前在讲自动配置原理的时候讲过,这个东西呢?SpringFactoriesLoader就是从spring.factories那个文件里面来读取这些类,所以我们来看一下,它是要读取哪些类呢?它是要读取Bootstrapper,但是呢,names等于0,它相当于会去来找所有的spring.factories这个文件里面看你有没有在这配置称为Bootstrapper类型。所以,我们如果想要项目一启动以后有一些启动类,所以我们在这一块找寻办法就是去spring.factories文件中找这个org.springframework.boot.Bootstrapper类型的,没有我们就不管,说明呢,我们当前类里面所有的jar包里面都没人配置这个东西,那如果有配置的话,会把这些东西创建一个实例,把这些实例给我们返回,而现在没有任何实例,说明我们的项目初始化启动没有任何初始化的引导器

 11、这个东西我们先不管,现在又有一个核心叫setInitializers(翻译过来叫初始化器),它还是这个方法getSpringFactoriesInstances,如果大家以后呢,都遇到这个方法,都是去spring.factories这个文件里面去来找,看你有没有相关配置这个类,它的值是什么。你如果在系统里面配了一个叫ApplicationContextInitializer它就能给我们找到,如果找到了以后呢,会set保存起来,保存为initializers这个属性,它不仅找到了,还找到了7个

①、spring.factories找到ApplicationContextInitializer

 ②、源码

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
		this.resourceLoader = resourceLoader;
		Assert.notNull(primarySources, "PrimarySources must not be null");
		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		this.webApplicationType = WebApplicationType.deduceFr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值