Dealing with command line arguments and Spring

前端 未结 7 629
孤街浪徒
孤街浪徒 2020-12-13 04:19

When I\'m writing a Spring command line application which parses command line arguments, how do I pass them to Spring? Would I want to have my main() structured so that it f

7条回答
  •  不思量自难忘°
    2020-12-13 04:43

    Consider the following class:

    public class ExternalBeanReferneceFactoryBean 
        extends AbstractFactoryBean
        implements BeanNameAware {
    
        private static Map instances = new HashMap();
        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;
        }
    
    }
    

    along with:

    /**
     * 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"));
    
    }
    

提交回复
热议问题