处理命令行参数和Spring

当我编写一个parsing命令行参数的Spring命令行应用程序时,我如何将它们传递给Spring? 我想要我的main()结构化,以便它首先parsing命令行参数,然后在Spring? 即便如此,它将如何将持有parsing的参数的对象传递给Spring呢?

两种可能性我都能想到。

1)设置一个静态引用。 (在这种情况下,静态variables,虽然通常皱眉,是可以的,因为只能有一个命令行调用)。

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

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

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

或者(如果你完全反对静态variables),你可以:

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

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

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

您还可以将Object数组作为第二个parameter passing给getBean ,它将用作构造函数或工厂的参数。

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

考虑以下课程:

 public class ExternalBeanReferneceFactoryBean extends AbstractFactoryBean implements BeanNameAware { private static Map<String, Object> instances = new HashMap<String, Object>(); private String beanName; /** * @param instance the instance to set */ public static void setInstance(String beanName, Object instance) { instances.put(beanName, instance); } @Override protected Object createInstance() throws Exception { return instances.get(beanName); } @Override public Class<?> getObjectType() { return instances.get(beanName).getClass(); } @Override public void setBeanName(String name) { this.beanName = name; } } 

随着:

 /** * Starts the job server. * @param args command line arguments */ public static void main(String[] args) { // parse the command line CommandLineParser parser = new GnuParser(); CommandLine cmdLine = null; try { cmdLine = parser.parse(OPTIONS, args); } catch(ParseException pe) { System.err.println("Error parsing command line: "+pe.getMessage()); new HelpFormatter().printHelp("command", OPTIONS); return; } // create root beanFactory DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // register bean definition for the command line ExternalBeanReferneceFactoryBean.setInstance("commandLine", cmdLine); beanFactory.registerBeanDefinition("commandLine", BeanDefinitionBuilder .rootBeanDefinition(ExternalBeanReferneceFactoryBean.class) .getBeanDefinition()); // create application context GenericApplicationContext rootAppContext = new GenericApplicationContext(beanFactory); rootAppContext.refresh(); // create the application context ApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] { "/commandlineapp/applicationContext.xml" }, rootAppContext); System.out.println(appContext.getBean("commandLine")); } 

这里是一个Main方法的引导弹簧的例子,只需像通常那样获取传递的参数,然后在你的bean上调用函数(在deployer.execute()的情况下)将它们作为string或通过任何你认为合适的格式。

 public static void main(String[] args) throws IOException, ConfigurationException { Deployer deployer = bootstrapSpring(); deployer.execute(); } private static Deployer bootstrapSpring() { FileSystemXmlApplicationContext appContext = new FileSystemXmlApplicationContext("spring/deployerContext.xml"); Deployer deployer = (Deployer)appContext.getBean("deployer"); return deployer; } 

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

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

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

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

如果您对Spring Boot属性parsing命令感兴趣,请参阅此页面 。