有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
我们在编写启动类时,会传递一个args
参数,它是一个String
类型的数组,这个参数怎么传递?有什么用?
@SpringBootApplication
public class App1 {
public static void main(String[] args) {
SpringApplication.run(App1.class,nsz);
}
}
直接在启动类中声明需要传递的参数,参数使用--
为前缀,=
为键值对分隔符:
@SpringBootApplication
public class App1 {
public static void main(String[] args) {
// 传递参数
args = new String[]{"--spring.profiles.active=dev", "--name=zhangsan"};
SpringApplication.run(App1.class, args);
}
}
通过java -jar
启动时,可以在命令行的最末尾传递参数:
java -jar xx.jar --name=zhangsan --spring.profiles.active=dev
通过命令行参数启动时,这些参数会被传递到启动类中,在这里可以直接获取这些参数:
选项参数
可以理解为Spring Boot
提供的参数格式,上面的案例中都是选项参数,以--
开头,使用=
分割键值对,使用java -jar
启动时,需要注意需要写在最后面,不然会报错。
非选项参数
就是没有--
开头参数,也没有设置值的单一参数,只有名称,比如下面的age
和gender
都是非选项参数:
java -jar xx.jar --name=zhangsan --spring.profiles.active=dev age gender
-Dxxxx
是java 运行参数的语法,用于配置一些环境变量,比如-Dserver.port
就是系统参数:
java -jar -Dserver.port=8081 app-service001-1.0-SNAPSHOT.jar
既然知道了怎么设置参数,接下来就是要知道怎么获取和使用这些参数了,实际应该结合开发中遇到的问题来灵活应用。
首先,我们在YML
配置文件中声明当前多环境为test
(测试):
spring:
profiles:
active: test
然后在启动时,指定环境为prod
(生产):
java -jar xx.jar --name=zhangsan --spring.profiles.active=prod
可以看到启动时,多环境设置了为prod
,说明启动参数优先级最高,会替换同名配置属性,比如多环境、启动端口、数据库连接通常使用这种方式,在启动的时候动态配置。
在启动时,会将这些参数封装为ApplicationArguments
对象,设置到环境对象中,也会注册一个名称为springApplicationArguments
的Bean。
可以看到该Bean 中包含了选项参数和非选项参数:
可以注入springApplicationArguments
Bean 来获取启动参数:
@Autowired
ApplicationArguments springApplicationArguments;
@Bean
User user() {
User user = new User();
// 获取原始的参数:--spring.profiles.active=dev
String[] sourceArgs = springApplicationArguments.getSourceArgs();
// 获取非选项参数
List<String> argsNonOptionArgs = springApplicationArguments.getNonOptionArgs();//
// 获取参数的KEY :spring.profiles.active
Set<String> argsOptionNames = springApplicationArguments.getOptionNames();
// 获取参数KEY对应的值,可以多个
List<String> optionValues = springApplicationArguments.getOptionValues("name");
// 是否包含该参数
boolean age = springApplicationArguments.containsOption("age");
System.out.println("springApplicationArguments");
System.out.println(sourceArgs);
System.out.println(argsNonOptionArgs);
System.out.println(argsOptionNames);
System.out.println(optionValues);
return user;
}
打印结果如下:
也可以通过环境Bean 对象来获取启动参数值:
@Autowired
Environment environment;
@Bean
User user(){
String name = environment.getProperty("name");
System.out.println(name);
return new User();
}
还可以使用 @Value
获取启动参数:
@Value("${name}")
String name;
-D
添加的系统参数,可以通过Environment
或者System
类获取:
@Autowired
Environment environment;
@Bean
User user(){
System.out.println(environment.getProperty("age"));
System.out.println(System.getProperty("age"));
return new User();
}