سؤال

عندما أكتب تطبيق سطر أوامر Spring الذي يوزع وسيطات سطر الأوامر، كيف يمكنني تمريرها إلى Spring؟هل أرغب في تنظيم main() الخاص بي بحيث يقوم أولاً بتوزيع وسيطات سطر الأوامر ثم يبدأ الربيع؟ومع ذلك، كيف يمكن تمرير الكائن الذي يحمل الحجج التي تم تحليلها إلى الربيع؟

هل كانت مفيدة؟

المحلول

هناك احتمالان يمكنني التفكير فيهما.

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 - كطريقة واحدة للقيام بذلك.يمنحك فئة رئيسية تقوم تلقائيًا بتحميل سياقات الربيع ولديها القدرة على استخدام Commons-CLI لتحليل وسيطات سطر الأوامر تلقائيًا وحقنها في حبوبك.

يمكنك أيضًا تمرير مصفوفة كائن كمعلمة ثانية إلى getBean والتي سيتم استخدامها كوسائط للمنشئ أو المصنع.

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

بدءًا من Spring 3.1، ليست هناك حاجة لأي كود مخصص مقترح في الإجابات الأخرى.يفحص CommandLinePropertySource, ، فهو يوفر طريقة طبيعية لإدخال وسيطات CL في السياق الخاص بك.

وإذا كنت مطور Spring Boot محظوظًا، فيمكنك تبسيط التعليمات البرمجية الخاصة بك خطوة واحدة للأمام للاستفادة من حقيقة ذلك SpringApplication يمنحك ما يلي:

بشكل افتراضي ، ستعمل الفئة على الخطوات التالية لتمهيد تطبيقك:

...

قم بتسجيل خط الأوامر اطلاع على فضح وسيطات سطر الأوامر كخصائص الربيع

وإذا كنت مهتمًا بأمر حل خاصية Spring Boot، فيرجى الرجوع إلى ذلك هذه الصفحة.

خذ بعين الاعتبار الفئة التالية:

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

}

فيما يلي مثال لتمهيد حزام الزنبرك للطريقة الرئيسية، ما عليك سوى الحصول على المعلمات التي تم تمريرها كالمعتاد ثم جعل الوظيفة التي تستدعيها على الفول الخاص بك (في حالة Publisher.execute()) تأخذها كسلاسل أو عبر أي تنسيق تشعر أنه مناسب .

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top