@SpringBootApplication_springboot启动类作用

@SpringBootApplication_springboot启动类作用Args作用传递参数的一种方式;例如启动的时候java-jar–spring.profiles.active=prod或者更改自己的自定义配置信息;使用方式是–key=value它的信息优先于项目里面的配置;我们现在大部分项目都是用SpringBoot进行开发的,一般启动类的格式是SpringApplication.run(SpringBootDemoPropertiesApplication.class,args);但是好像平常一直也没有用到args;也没有穿过参数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Args 作用


传递参数的一种方式; 例如启动的时候 java -jar --spring.profiles.active=prod
或者更改自己的自定义配置信息 ;使用方式是 --key=value
它的配置优先于项目里面的配置;

我们现在大部分项目都是用SpringBoot进行开发的,一般启动类的格式是
SpringApplication.run(SpringBootDemoPropertiesApplication.class, args);
但是好像平常一直也没有用到args; 也没有穿过参数,那么这个args究竟有什么用呢?我们随着源码一探究竟!

启动一个带web的项目,并且在application.yml配置文件里面定义一个自定义属性developer. name=test
以下是启动类, args设置一些参数

@SpringBootApplication
public class SpringBootDemoPropertiesApplication { 
   

	public static void main(String[] args) { 
   
	    args = new String[]{ 
   "1","2","--name=shienchuang","--name=shizhenzhen","age=18","--developer.name=shirenchuang666"};
		SpringApplication.run(SpringBootDemoPropertiesApplication.class, args);
	}
}

Args使用场景一

进入run方法看到 args第一次出现在 SpringApplication类中的

private SpringApplicationRunListeners getRunListeners(String[] args) { 
   
		Class<?>[] types = new Class<?>[] { 
    SpringApplication.class, String[].class };
		return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
				SpringApplicationRunListener.class, types, this, args));
	}

方法中getSpringFactoriesInstances( SpringApplicationRunListener.class, types, this, args) 用于实例化 SpringApplicationRunListener的实现类(配置在spring.factories中的实现类)
关于spring.factories的用法可以参考: 【SpringBoot 二】spring.factories加载时机分析

此项目中只在spring.factories找到了一个实现类org.springframework.boot.context.event.EventPublishingRunListener
在这里插入图片描述

在实例化 的过程中是有把 两个参数{SpringApplication 和 String[] args} 传递过去的
在这里插入图片描述
那么对应到的构造函数就是
在这里插入图片描述

并且可以看到在EventPublishingRunListener的方法中都有把Args传递下去;

Args使用场景二

上面的SpringApplicationRunListeners完事之后,接下来就到了

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;
	}

SimpleCommandLinePropertySource

主要看上面的 new Source(args)方法; 这个Source继承了类SimpleCommandLinePropertySource
在这里插入图片描述
那么SimpleCommandLinePropertySource作用是什么?

SimpleCommandLinePropertySource也是一个数据源PropertySource ;但是它主要是存放命令行属性;例如启动参数Args;中的属性就会保存在这个对象中; 并且SimpleCommandLinePropertySource会被放入到Environment中; 所以也就可以通过{@link Environment#getProperty(String)}来获取命令行的值了

	public SimpleCommandLinePropertySource(String... args) { 
   
		super(new SimpleCommandLineArgsParser().parse(args));
	}

看构造函数 可以知道实例化之后的SimpleCommandLinePropertySource 是name为commandLineArgs 的数据源; 属性值的解析规则如下

  • –key=value key=value的前面接上两个- 就会解析成kv格式
  • key可以相同 ,并且value可以多个; 她是一个List接口;一个key可以对应多个value
  • 不能有空格
  • 如果不是 –key=value的格式,那么都会被解析到一个 key为nonOptionArgs的list中

在这里插入图片描述
往下面走到了

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);
				composite.addPropertySource(new SimpleCommandLinePropertySource(
						"springApplicationCommandLineArgs", args));
				composite.addPropertySource(source);
				sources.replace(name, composite);
			}
			else { 
   
				sources.addFirst(new SimpleCommandLinePropertySource(args));
			}
		}
	}

这个方法的作用就是把 我们的Args 放到到Spring的 environment中;
sources.addFirst(new SimpleCommandLinePropertySource(args));
看到方法是 addFirst(); 这个说明什么?说明命令行的的数据源被放到了最前面;那么命令行数据源的属性就会被最优先采用;
在这里插入图片描述

那么我们就可以通过Environment#getProperty(String) 获取args中的值了;
那么我们可以利用这个args做什么用;?

可以用它来写入 配置; 并且是覆盖项目中的配置(因为他的优先级更高);
例如 java -jar --spring.profiles.active=dev
在这里插入图片描述
这里就算yml配置的是prod;最终使用的是dev;

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197220.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月8日 上午9:22
下一篇 2025年9月8日 上午10:01


相关推荐

  • PLANTINUM_plantuml流程图

    PLANTINUM_plantuml流程图bytotinunsplash1.背景随着工作时间的增长,越发觉得用专业的图形(用例图,时序图,ER图等等)去准确表达想法是很重要的。比如针对某个需求绘制的的用例图,比一段乏味的文字来的更加有意义,也便于别人理解。加之最近在学习源码的时候,发现很多书籍中都会使用类图,时序图等UML语言来描述逻辑关系。于是就在网上找了找绘制UML语言时,业界主流的一些工具都用什么,找了半天,大部分都用了下面…

    2025年7月20日
    2
  • VS注释快捷键和取消注释快捷键

    VS注释快捷键和取消注释快捷键VS 的快捷键过段时间就会忘 主要是因为日常用的是 VScode VS 不大常用 每次用 VS 还得去查快捷键 为了避免麻烦 记在这儿 注释快捷键 首先选中要注释的代码 单行或多行先摁 CTRL K 组合键再摁 CTRL C 组合键取消注释快捷键首先选中要取消注释的代码 单行或多行先摁 CTRL K 组合键再摁 CTRL U 组合键

    2026年3月17日
    2
  • 关于AI绘画软件Midjourney的详细介绍

    关于AI绘画软件Midjourney的详细介绍

    2026年3月15日
    4
  • tomcat面试题

    tomcat面试题1.tomcat给你你怎样去调优?1.JVM参数调优:-Xms表示JVM初始化堆的大小,-Xmx表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA_OPTS=’-Xms256m-Xmx512m’,表示

    2022年6月7日
    41
  • JavaScript节流 防抖

    JavaScript节流 防抖说明 此文章仅供参考和学习使用 转载请注明出处 1 防抖 阻止一个函数在很短的时间间隔内连续调用 只有在上一次函数调用执行后达到规定的时间间隔 才能进行下一次调用 但要保证一个一个累计最小调用的时间 相当于将若干函数的调用 合并为在某个固定的时间间隔内的一次函数的调用 只要不是最后一次触发 就不异步执行请求 应用场景 函数节流一般用于 onresize onscroll 等短时间内会多

    2026年3月26日
    2
  • 订单支付[通俗易懂]

    订单支付[通俗易懂]前言文章中的图片和在摘录不是来自一篇文章,所以细节不是完全对应。可借鉴的是开发的思路:从整体的功能模块的使用; 到核心流程; 到系统实现的架构; 再到代码流程(可以采用序列图)。前两点是业务需求,后两点是功能实现。支付系统的作用https://www.cnblogs.com/veblen/p/10992167.html核心流程http://www….

    2022年5月3日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号