Springboot热部署原理

一、配置加载

    public static void main(String[] args) {         ConfigurableApplicationContext ctx = SpringApplication.run(SampleTomcatApplication.class, args);         String foo = ctx.getEnvironment().getProperty("foo");         System.out.println(foo);     }

打印结果

aaa,bbb

源码解析

1、我们在idea环境配置的参数Program arguments上配置的参数,就会被传进main方法的args中

    //封装命令行参数     ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);          public DefaultApplicationArguments(String... args) {         Assert.notNull(args, "Args must not be null");         this.source = new Source(args);         this.args = args;     }     Source(String[] args) {         super(args);     }     public SimpleCommandLinePropertySource(String... args) {         super(new SimpleCommandLineArgsParser().parse(args));     }     //解析命令行参数     public CommandLineArgs parse(String... args) {         CommandLineArgs commandLineArgs = new CommandLineArgs();         for (String arg : args) {             //固定格式             if (arg.startsWith("--")) {                 String optionText = arg.substring(2);                 String optionName;                 String optionValue = null;                 int indexOfEqualsSign = optionText.indexOf('=');                 if (indexOfEqualsSign > -1) {                     optionName = optionText.substring(0, indexOfEqualsSign);                     optionValue = optionText.substring(indexOfEqualsSign + 1);                 }                 else {                     optionName = optionText;                 }                 if (optionName.isEmpty()) {                     throw new IllegalArgumentException("Invalid argument syntax: " + arg);                 }                 commandLineArgs.addOptionArg(optionName, optionValue);             }             else {                 commandLineArgs.addNonOptionArg(arg);             }         }         return commandLineArgs;     }

解析完命令行参数,最终放入到了PropertySource的source属性中,代码就不放了

2、构建环境

ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);

        //创建并配置相应的环境,获取对应的ConfigurableEnvironment         ConfigurableEnvironment environment = getOrCreateEnvironment();         //根据用户配置,配置 environment系统环境         configureEnvironment(environment, applicationArguments.getSourceArgs());

创建环境

//根据环境创建对应ConfigurableEnvironment     private ConfigurableEnvironment getOrCreateEnvironment() {         if (this.environment != null) {             return this.environment;         }         switch (this.webApplicationType) {         case SERVLET://Web程序             return new StandardServletEnvironment();         case REACTIVE://响应式web环境             return new StandardReactiveWebEnvironment();         default://普通程序             return new StandardEnvironment();         }     }

都继承自AbstractEnvironment

public abstract class AbstractEnvironment implements ConfigurableEnvironment {          //初始化配置文件source对象     private final MutablePropertySources propertySources = new MutablePropertySources();          //初始化了配置文件解析器     private final ConfigurablePropertyResolver propertyResolver =             new PropertySourcesPropertyResolver(this.propertySources);      ··· }

解析配置文件,并配置到环境中

    protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) {         if (this.addConversionService) {             ConversionService conversionService = ApplicationConversionService.getSharedInstance();             environment.setConversionService((ConfigurableConversionService) conversionService);         }         // 将main 函数的args封装成 SimpleCommandLinePropertySource 加入environment中。         configurePropertySources(environment, args);         // 激活相应的配置文件         configureProfiles(environment, args);     }          protected void configurePropertySources(ConfigurableEnvironment environment, String[] args) {         MutablePropertySources sources = environment.getPropertySources();         if (this.defaultProperties != null && !this.defaultProperties.isEmpty()) {             sources.addLast(new MapPropertySource("defaultProperties", this.defaultProperties));         }         if (this.addCommandLineProperties && args.length > 0) {             String name = CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME;             if (sources.contains(name)) {                 PropertySource<?> source = sources.get(name);                 CompositePropertySource composite = new CompositePropertySource(name);                 //解析args,并设置到source属性中,SimpleCommandLinePropertySource继承自PropertySource                 composite.addPropertySource(                         new SimpleCommandLinePropertySource("springApplicationCommandLineArgs", args));                 composite.addPropertySource(source);                 //存在覆盖的参数,则替换                 sources.replace(name, composite);             } else {                 //解析并设置参数到环境中                 sources.addFirst(new SimpleCommandLinePropertySource(args));             }         }     }

获取配置文件属性String foo = ctx.getEnvironment().getProperty("foo");

    public String getProperty(String key) {         return this.propertyResolver.getProperty(key);     }

走的就是AbstractEnvironment方法,通过ConfigurablePropertyResolver的方法获取,具体获取源码也不看了。

二、热部署

jar包依赖

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-devtools</artifactId> </dependency>

 

推荐这些技术文章:

SpringBoot热部署

1.引入包和插件
<!-- 引入依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</...

springBoot-启动原理

注:SpringBoot版本 2.6.2
SpringBoot的入口是从SpringApplication.run()传入我们的主启动类开始

@SpringBootApplication
public class LeeSpringbootApplication {

public static void main(String[] args) {
SpringAppl...

在idea开启热部署

第一步

 
 

第二步

 
 

重启idea

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/200...

SpringBoot启动原理及相关流程

 
一、springboot启动原理及相关流程概览
  springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置。那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置

 
二、springboot的启动类入口
  用过springboot的技术人员很显而易见的两者之间的差别就是视觉上很直观的:springboot有自己独立的启动类(独立...

new操作符及原理

new
构造函数也是函数,唯一区别就是调用方式不同,任何函数只要使用new操作符调用就是构造函数,不适用new操作符调用的就是普通函数。

 
对象实例的创建过程:

在内存中创建一个新对象。
这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
执行构造函数内部的代码...

springboot之启动原理解析及源码阅读

前言
SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面纱,让它不在神秘。

 
正文
我们开发任何一个Spring Boot项目,都会用到如下的启动类

@SpringBootApplication
public class Applica...

文章标题:Springboot热部署原理
文章链接:https://www.dianjilingqu.com/3709.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>