处理命令行参数和 Spring

2022-09-01 03:45:37

当我编写一个解析命令行参数的Spring命令行应用程序时,如何将它们传递给Spring?我是否希望构建我的main()结构,以便它首先解析命令行args,然后初始化Spring?即便如此,它将如何将保存解析的参数的对象传递给Spring?


答案 1

我能想到的两种可能性。

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

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

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

<util:constant static-field="MyApp.ARGS"/>

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

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

 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"
   };

 }

解析命令行参数留给读者作为练习。


答案 2

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


推荐