处理命令行参数和 Spring
2022-09-01 03:45:37
当我编写一个解析命令行参数的Spring命令行应用程序时,如何将它们传递给Spring?我是否希望构建我的main()结构,以便它首先解析命令行args,然后初始化Spring?即便如此,它将如何将保存解析的参数的对象传递给Spring?
当我编写一个解析命令行参数的Spring命令行应用程序时,如何将它们传递给Spring?我是否希望构建我的main()结构,以便它首先解析命令行args,然后初始化Spring?即便如此,它将如何将保存解析的参数的对象传递给Spring?
我能想到的两种可能性。
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"
};
}
解析命令行参数留给读者作为练习。
看看我的Spring-CLI库 - http://github.com/sazzer/spring-cli - 作为做到这一点的一种方式。它为您提供了一个主类,该主类可以自动加载spring上下文,并能够使用Commons-CLI自动解析命令行参数并将其注入到您的bean中。