springboot之高级特性与执行原理刨铣(结业篇)

一、高级特性

(一)Profile使用

1、Profile场景切换

我们在开发过程中,就会进行不断的测试,不会是完全开发好了再进行测试,所以我们肯定是有开发环境,测试环境以及发布环境。

(1)模拟环境

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    默认的启动,加载了我们的默认使用的application.properteis.

(2)激活其他场景

在这里插入图片描述
在这里插入图片描述
如果这样修改
在这里插入图片描述
此时你激活dev的话,那就要写8006才可以访问了。

(3)发布时修改也可以

java -jar xxx.jar --spring.profiles.active=prod
在这里插入图片描述

2、Profile进行条件装配

(1)提前理解

  • 首先看我们这种情况
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上面没什么问题吧,

(2)解决问题

如果现在我们的person在公司分了两类,一类是干活的员工,另外是管理的经历与老板。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 那我们此时就可以用profile进行区别对待
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 启动测试
    在这里插入图片描述
    在这里插入图片描述
    发现没有提供toString方法,进去添加
    在这里插入图片描述
    如果我们激活test的话就会是Boss
    在这里插入图片描述

3、使用Profile进行分组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)外部化配置

1、什么是外部化配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 通过Java属性文件、YAML文件、环境变量、命令行参数进行配置;(总体包括了如上的14种)
    在这里插入图片描述
    常用的是画红线的两种。
  • 然后进行后续用value或configurationProperties进行获取。

2、配置文件加载的优先级

(1)优先级分析

在这里插入图片描述
在这么一个顺序中,优先级越来越高,但是我们不用死记硬背,要记住后面的配置会覆盖调上一步配置的。

(2)资源文件所放置位置

在这里插入图片描述
他们的优先级的话,会是越往下越高。

  • (1)与(2)比较简单就不说了
  • (3)只要把你项目打成jar包与然后我们的application.yaml写在同一个目录,就可以了
  • (4)就是在自己项目的jar包里面新建一个config文件进行配置。{他们是同一个目录}

(3)加载顺序

在这里插入图片描述
这个也是,下面加载的会覆盖上面加载的。

(4)小总结

指定环境优先,外部优先,后面配置的可以覆盖前面配置。

(三)自定义Starter

SpringBoot整合了很多东西,我们都可以引入相应的starter进行配置,然后使用他们的功能。但是有些时候会用到自定义的,现在在boot阶段不是很明显,在为服务器的时候就会很明显。

1、分析别人的starter

在这里插入图片描述
就看test的,test的我熟。
在这里插入图片描述
它们流弊就流在这里,整了AutoConfiguration的。

  • autoconfigure包中配置使用 META-INF/spring.factories 中 EnableAutoConfiguration 的值,使得项目启动加载指定的自动配置类

  • 编写自动配置类 xxxAutoConfiguration -> xxxxProperties

    • @Configuration
    • @Conditional
    • @EnableConfigurationProperties
    • @Bean
  • 具体配置的步骤是
    在这里插入图片描述

2、先创建一个空项目

在这里插入图片描述

  • 然后再创建爱你一个模块
    在这里插入图片描述
    在这里插入图片描述

(1)模拟环境

  • 项目结构
    在这里插入图片描述
  • 业务逻辑
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(2)打包

在这里插入图片描述
在这里插入图片描述
相当于把它安装到本地库里面了。然后其他要使用的话就可以引入即可

(3)引入自己开发的包

在这里插入图片描述

3、其他项目引入看看

  • 引入依赖
    在这里插入图片描述

  • 分析之前的情况
    在这里插入图片描述
    之前说到,在这里只有它这里写死的才会被默认加载,而我们自定义的还要经过出来才能被自动配置。

  • 原先项目
    在这里插入图片描述
    在这里插入图片描述
    然后重新打包clean与install。

  • 在这里进行引入
    在这里插入图片描述

二、SpringApplication创建初始化流程

1、SpringBoot启动过程

SpringBoot还是去调用的springApplication,具体原理是什么呢,又为我们准备了些什么呢
在这里插入图片描述

  • 打断点看过程
    在这里插入图片描述
    在这里插入图片描述
    可以分为两大步:创建SpringApplication与执行run方法

(1)创建SpringApplication的过程

在这里插入图片描述

  • 加载资源(保存信息)
    在这里插入图片描述
    会加载判断保存一些信息。
    在这里插入图片描述

  • 判断当前主配置类(它会找你表示了SpringBootApplication注解的类)
    在这里插入图片描述

  • 看当前web应用的类型
    在这里插入图片描述
    会用WebApplicationType判断你web应用类型
    在这里插入图片描述
    最后我们这个项目肯定是返回了一个servlet类型的应用。

  • 初始化启动器
    在这里插入图片描述
    getSpringFactoriesInstances进入这个方法发现我们的项目并没有什么初始化引导器。

  • 找初始化:(它会去配置Spring.factories文件里面找)
    在这里插入图片描述
    在这里插入图片描述
    发现有七个,如下的初始化器有两个,然后其他包里面肯定有配了5个。
    在这里插入图片描述
    在这里插入图片描述

  • 找一些监听器
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    找到了九个

  • 确定哪个是主类(会找哪个类有main方法)
    在这里插入图片描述
    在这里插入图片描述

  • 小总结:在创建的SpringApplication的过程中,它会先找到相应的组件,然后保存起来。后续会使用这些组件。

(2)SpringBoot完整启动流程(执行run方法)

在这里插入图片描述

  • 记录启动时间
    在这里插入图片描述

  • 创建引导上下文
    在这里插入图片描述
    在这里插入图片描述
    获取到之前所有的BootStrappers挨个执行initialize()方法引导启动器上下文环境设置。

  • 让当前应用进入handlers模式:java.awt.handlers(相当于自力更生模式了)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 获取所有RunListener(运行时监听器)
    在这里插入图片描述
    在这里插入图片描述
    getSpringFactoriesInstances还是这个方法去获取运行时监听器。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    遍历所有的监听器,并且启动这些监听器,相当于一个时间通知机制,通知所有感兴趣系统正在启动过程的人,项目正在启动。【比如,你项目再获取的时候,你想获取一些信息,此时你就可以写一些监听器了,然后它在这一步就会通知你】

  • 保存两面行参数(可能你有一个日志文件,后续要用)
    在这里插入图片描述

  • 准备环境的内容
    在这里插入图片描述
    在这里插入图片描述
    有就直接返回,没有就会创建。【我们是servlet就会创建一个servlet环境,,环境信息会保存servlet的基本信息】
    在这里插入图片描述
    后续的就是进行配置
    在这里插入图片描述
    在这里插入图片描述
    上面一步会读取所有配置源的配置属性值。然后接下来配置了profile的配置(就是我们用的那个注解,它会在这里获取)
    在这里插入图片描述

  • 绑定工作
    在这里插入图片描述

  • 监听器调用environmentPrepared这个方法
    在这里插入图片描述
    通知所有的监听器,准备工作已经完成

  • 然后就是进行绑定了
    在这里插入图片描述
    在这里插入图片描述
    然后返回
    在这里插入图片描述

  • 打印banner【这一步放行的话就会打印了】
    在这里插入图片描述

  • 创建IOC容器【非常重要】
    在这里插入图片描述
    根据当前项目类型创建相应容器。
    在这里插入图片描述
    在这里插入图片描述

    • 记录启动的事件
      在这里插入图片描述

    • 准备容器信息{前面是准备基础环境信息}
      在这里插入图片描述
      在这里插入图片描述

    • 应用初始化器
      在这里插入图片描述
      获取初始化器
      在这里插入图片描述遍历所有的初始化器,调用初始化器,来对IOC容器进行初始化的扩展。
      在这里插入图片描述

    • 遍历所有的监听器
      在这里插入图片描述
      通知所有的监听器
      在这里插入图片描述

    • 到这个方法的结束又去调用了contextloaded方法,通知所有的监听器,准备完成了。
      在这里插入图片描述

  • 刷新IOC容器
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    核心就是注册单实例组件哦(会实例化所有的组件了)

  • 然后又调用了所有监听器,通知监听器
    在这里插入图片描述

  • 调用所有的Runners
    在这里插入图片描述
    在这里插入图片描述
    并且根据Order进行排序
    在这里插入图片描述
    遍历所有的runner并且调用run方法。
    在这里插入图片描述

  • 如果有异常就报错【原来如此,写了那么多demo,都是报这个错】
    在这里插入图片描述

  • 然后后续有调用了Running方法。

  • 然后最后返回容器。就结束了。

2、SpringBoot自监听器

上面我们发现不管完成了多少,完成了什么,什么时候做了什么,都会通知所有的监听者,如果我们要进行监听的时候,我们就可以自己写监听器。

(1)先定义我们几个重要的类

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

public class MyApplicationContextInitializer implements ApplicationContextInitializer {

    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("MyApplicationContextInitializer 初始化啦");
    }
}

public class MyApplicationListener implements ApplicationListener {
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("MyApplicationListener 通知啦");
    }
}

@Component
public class MyApplicationRunner implements ApplicationRunner {
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("MyApplicationRunner 运行啦");
    }
}

@Component
public class MyCommandLineRunner implements CommandLineRunner {
    public void run(String... args) throws Exception {
        System.out.println("执行了 MyCommandLineRunner");
    }
}

public class MySpringApplicationRunListener implements SpringApplicationRunListener {

    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("MySpringApplicationRunListener 启动啦");
    }

    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("MySpringApplicationRunListener 环境准备完成");

    }

    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("MySpringApplicationRunListener IOC容器准备完成");

    }

    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("MySpringApplicationRunListener IOC容器加载完成");

    }



    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("MySpringApplicationRunListener 启动啦");

    }
}

(2)这样整合

在这里插入图片描述
另外两个只要使用component注入即可。

  • 启动测试
    在这里插入图片描述
    没有构造器
    在这里插入图片描述
    在这里插入图片描述

三、后续安排

后续的就是整合具体的应用了,比如后续的MQ啊,docker等,后续就慢慢的加油了,完结,撒花。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值