弹簧引导启动命令参数及源码详析

  

  

使用过春天的引导,我们都知道通过java jar可以快速启动弹簧启动项目,同时,也可以通过在执行jar jar时传递参数来进行配置。本文带大家系统的了解一下弹簧引导命令行参数相关的功能及相关源码分析。

  


  

  

启动弹簧启动项目时,我们可以通过如下方式传递参数:

  
  

java jar xxx。jar——服务器。端口=8081
  

     

默认情况下弹簧引导使用8080端口,通过上述参数将其修改为8081端口,而且通过命令行传递的参数具有更高的优先级,会覆盖同名的其他配置参数。

  

启动弹簧启动项目时传递参数,有三种参数形式:

  
      <李>选项参数   <李>非选项参数   <李>系统参数   
  

选项参数,上面的示例便是选项参数的使用方法,通过”——server.port”来设置应用程序的端口。基本格式为“- name=值”(“-”为连续两个减号)。其配置作用等价于在application.properties中配置的server.port=8081。

  

非选项参数的使用示例如下:

        java jar xxx。jar abc def      

上述示例中,“abc”和“def”便是非选项参数。

  

系统参数,该参数会被设置到系统变量中,使用示例如下:

        java jar -Dserver。端口=8081 xxx.jar      


  

  

选项参数和非选项参数均可以通过ApplicationArguments接口获取,具体获取方法直接在使用参数的类中注入该接口即可。

        @RestController   公开课ArgumentsController {   @   私人ApplicationArguments参数;   }      

通过ApplicationArguments接口提供的方法即可获得对应的参数。关于该接口后面会详细讲解。

  

另外,选项参数,也可以直接通过@ value在类中获取,如下:

        @RestController   公开课ParamController {   @ value (" $ {server.port} ")   私人字符串serverPort;   }      

系统参数可以通过有提供的方法获取:

        字符串systemServerPort=System.getProperty (“server.port”);      


  

  

关于参数值区别,重点看选项参数和系统参数。通过上面的示例我们已经发现使用选项参数时,参数在命令中是位于xxx。jar之后传递的,而系统参数是紧随java jar之后。

  

如果不按照该顺序进行执行,比如使用如下方式使用选项参数:

        java jar——服务器。端口=8081 xxx.jar      

则会抛出如下异常:

  
  

未被选择:——服务器。端口=8081
  错误:无法创建Java虚拟机。
  错误:一个致命的异常发生。程序将退出。
  

     

如果将系统参数放在jar包后面,问题会更严重。会出现可以正常启动,但参数无法生效。这也是为什么有时候明明传递了参数但是却未生效,那很可能是因为把参数的位置写错了。

  

这个错误是最坑的,所以一定谨记:通过- d传递系统参数时,务必放置在待执行的jar包之前。

  

另外一个重要的不同是:通过@ value形式可以获得系统参数和选项参数,但通过System.getProperty方法只能获得系统参数。

  


  

  

上面提到了可以通过注入ApplicationArguments接口获得相关参数,下面看一下具体的使用示例:

        @RestController   公开课ArgumentsController {   @   私人ApplicationArguments参数;   @GetMapping ("/args”)   公共字符串getArgs () {   system . out。println(“#非选项参数数量:”+ arguments.getNonOptionArgs () .size ());   system . out。println(“#选项参数数量:”+ arguments.getOptionNames () .size ());   system . out。println(“#非选项具体参数:");   arguments.getNonOptionArgs () .forEach (system . out:: println);   system . out。println(“#选项参数具体参数:");   arguments.getOptionNames ()。forEach (optionName→{   system . out。println (optionName”——“+ +”=? arguments.getOptionValues (optionName));   });   返回“成功”;   }   }      

通过注入ApplicationArguments接口,然后在方法中调用该接口的方法即可获得对应的参数信息。

  

ApplicationArguments接口中封装了启动时原始参数的数组,选项参数的列表,非选项参数的列表以及选项参数获得和检验。相关源码如下:

弹簧引导启动命令参数及源码详析