我们现在大部分项目都是用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);
}
}
进入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传递下去;
上面的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中
往下面走到了
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/3e83e04de24ae9a4073a92d06c04a34c.jpeg)
最后
文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。**
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!