• Spring Boot 2.x系列【9】功能篇之SpringApplication启动参数使用详解


    有道无术,术尚可求,有术无道,止于术。

    本系列Spring Boot版本2.7.0

    前言

    我们在编写启动类时,会传递一个args参数,它是一个String类型的数组,这个参数怎么传递?有什么用?

    @SpringBootApplication
    public class App1 {
        public static void main(String[] args) {
            SpringApplication.run(App1.class,nsz);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    传递参数

    方式1:启动类

    直接在启动类中声明需要传递的参数,参数使用--为前缀,=为键值对分隔符:

    @SpringBootApplication
    public class App1 {
        public static void main(String[] args) {
            // 传递参数
            args = new String[]{"--spring.profiles.active=dev", "--name=zhangsan"};
            SpringApplication.run(App1.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    方式2:命令行

    通过java -jar 启动时,可以在命令行的最末尾传递参数:

    java -jar xx.jar --name=zhangsan --spring.profiles.active=dev
    
    • 1

    通过命令行参数启动时,这些参数会被传递到启动类中,在这里可以直接获取这些参数:
    在这里插入图片描述

    参数类型

    选项参数

    选项参数可以理解为Spring Boot 提供的参数格式,上面的案例中都是选项参数,以--开头,使用=分割键值对,使用java -jar 启动时,需要注意需要写在最后面,不然会报错。

    非选项参数

    非选项参数 就是没有--开头参数,也没有设置值的单一参数,只有名称,比如下面的age gender都是非选项参数:

    java -jar xx.jar --name=zhangsan --spring.profiles.active=dev age gender
    
    • 1

    系统参数

    -Dxxxx是java 运行参数的语法,用于配置一些环境变量,比如-Dserver.port就是系统参数:

    java -jar -Dserver.port=8081 app-service001-1.0-SNAPSHOT.jar
    
    • 1

    获取参数

    既然知道了怎么设置参数,接下来就是要知道怎么获取和使用这些参数了,实际应该结合开发中遇到的问题来灵活应用。

    替换应用配置

    首先,我们在YML配置文件中声明当前多环境为test(测试):

    spring:
      profiles:
        active: test
    
    • 1
    • 2
    • 3

    然后在启动时,指定环境为prod(生产):

    java -jar xx.jar --name=zhangsan --spring.profiles.active=prod
    
    • 1

    可以看到启动时,多环境设置了为prod,说明启动参数优先级最高,会替换同名配置属性,比如多环境、启动端口、数据库连接通常使用这种方式,在启动的时候动态配置。
    在这里插入图片描述

    通过ApplicationArguments获取参数

    在启动时,会将这些参数封装为ApplicationArguments对象,设置到环境对象中,也会注册一个名称为springApplicationArguments的Bean。

    可以看到该Bean 中包含了选项参数和非选项参数:
    在这里插入图片描述
    可以注入springApplicationArgumentsBean 来获取启动参数:

        @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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    打印结果如下:
    在这里插入图片描述

    通过环境Environment获取参数

    也可以通过环境Bean 对象来获取启动参数值:

        @Autowired
        Environment environment;
        @Bean
        User user(){
            String name = environment.getProperty("name");
            System.out.println(name);
            return new User();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    通过 @Value获取参数

    还可以使用 @Value获取启动参数:

        @Value("${name}")
        String name;
    
    • 1
    • 2

    获取系统参数

    -D添加的系统参数,可以通过Environment 或者System类获取:

        @Autowired
        Environment environment;
    
        @Bean
        User user(){
            System.out.println(environment.getProperty("age"));
            System.out.println(System.getProperty("age"));
            return new User();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Unions
    从零开始的C语言学习第十九课:C语言内存函数
    Nginx 负载均衡 初步配置&验证 笔记
    springboot增加过滤器后中文乱码
    插件分享——无限网页文字复制 Simple Allow Copy
    京东AIGC实战项目复盘;第一门AI动画系统课程;百川智能启动2024校园招聘;Kaggle 2023 AI前沿报告 | ShowMeAI日报
    Vulkan渲染引擎开发教程 一、开发环境搭建
    Jenkins学习笔记
    L3-006 迎风一刀斩
    基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的实践应用
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/125601627