处理命令行参数和Spring

low*_*llk 37 java spring command-line

当我编写一个解析命令行参数的Spring命令行应用程序时,如何将它们传递给Spring?我想让我的main()结构化,以便它首先解析命令行args然后进入Spring吗?即便如此,它如何通过将解析的args保存到Spring的对象?

fli*_*ken 39

我能想到的两种可能性.

1)设置静态参考.(静态变量,虽然通常不赞成,但在这种情况下是可以的,因为只能有1个命令行调用).

public class MyApp {
  public static String[] ARGS; 
  public static void main(String[] args) {
    ARGS = args;
      // create context
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式引用Spring中的命令行参数:

<util:constant static-field="MyApp.ARGS"/>
Run Code Online (Sandbox Code Playgroud)

或者(如果您完全反对静态变量),您可以:

2)以编程方式将args添加到应用程序上下文中:

 public class MyApp2 {
   public static void main(String[] args) {
     DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

        // Define a bean and register it
     BeanDefinition beanDefinition = BeanDefinitionBuilder.
       rootBeanDefinition(Arrays.class, "asList")
       .addConstructorArgValue(args).getBeanDefinition();
     beanFactory.registerBeanDefinition("args", beanDefinition);
     GenericApplicationContext cmdArgCxt = new GenericApplicationContext(beanFactory);
     // Must call refresh to initialize context 
     cmdArgCxt.refresh();

     // Create application context, passing command line context as parent
     ApplicationContext mainContext = new ClassPathXmlApplicationContext(CONFIG_LOCATIONS, cmdArgCxt);

     // See if it's in the context
     System.out.println("Args: " + mainContext.getBean("args"));
   }

   private static String[] CONFIG_LOCATIONS = new String[] {
     "applicationContext.xml"
   };

 }
Run Code Online (Sandbox Code Playgroud)

解析命令行参数留给读者练习.

  • +1表示静态引用.6行代码优于20行. (4认同)

Ser*_*auk 7

从 Spring 3.1 开始,不需要其他答案中建议的任何自定义代码。检查CommandLinePropertySource,它提供了一种将 CL 参数注入上下文的自然方式。

如果您是一名幸运的 Spring Boot 开发人员,您可以利用SpringApplication为您提供以下功能的事实进一步简化您的代码:

默认情况下,类将执行以下步骤来引导您的应用程序:

...

注册 CommandLinePropertySource 以将命令行参数公开为 Spring 属性

如果您对 Spring Boot 属性解析顺序感兴趣,请参阅此页面


Gra*_*ham 6

看看我的Spring-CLI库 - 在http://github.com/sazzer/spring-cli - 作为这样做的一种方式.它为您提供了一个自动加载spring上下文的主类,并且能够使用Commons-CLI自动解析命令行参数并将它们注入到bean中.


BeW*_*ned 5

您还可以将Object数组作为第二个参数传递getBean给构造函数或工厂的参数.

public static void main(String[] args) {
   Mybean m = (Mybean)context.getBean("mybean", new Object[] {args});
}
Run Code Online (Sandbox Code Playgroud)