7974


今現在、 spring を用いて開発しています。  
context.xml の中で、 constructor-arg などを用いて、java の値(eg. String)を inject
できることは理解したのですが、たとえば main 関数の引数の値を inject したい場合などには、どのようにしたらこれを行なえるのでしょうか。


CC BY-SA 3.0
2015-03-16T05:18:17.333
7966
2015-03-16T08:35:11.370
754
question
java spring
(spring) DI にて、 main 引数など java の値を inject するには？


[こちら](https://stackoverflow.com/questions/132231/dealing-with-command-line-
arguments-and-spring)のページの転載にはなりますが、次の2つの方法があるようです。

  1. コマンドライン引数をstatic変数に入れて、SpringのBeanから参照する
  2. コマンドライン引数をBeanFactoryに登録して、それをアプリケーションコンテキストに反映する

1の例です。次のようなクラスがあるとします。

[code]

    public class MyApp {
      public static String[] ARGS; 
        public static void main(String[] args) {
          ARGS = args;
          // 通常のアプリケーションコンテキスト作成コード
      }
    }
    
[/code]

このstatic変数は次のような設定で使用できます。

[code]

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

2の例です。

[code]

    public class MyApp2 {
      public static void main(String[] args) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    
        // Beanを定義してコンテキストに登録する
        BeanDefinition beanDefinition = BeanDefinitionBuilder
            .rootBeanDefinition(Arrays.class, "asList")
            .addConstructorArgValue(args).getBeanDefinition();
        beanFactory.registerBeanDefinition("args", beanDefinition);
        GenericApplicationContext cmdArgCxt = new GenericApplicationContext(beanFactory);
        // 必ずrefreshを呼び出し、コンテキストを初期化する
        cmdArgCxt.refresh();
    
        // 設定ファイルと今作成したコンテキストから新しいアプリケーションコンテキストを作成する
        ApplicationContext mainContext = new ClassPathXmlApplicationContext("applicationContext.xml", cmdArgCxt);
    
        // Beanとしてコマンドライン引数を参照する
        System.out.println("Args: " + mainContext.getBean("args"));
      }
    
    }
    
[/code]


CC BY-SA 3.0
2015-03-16T08:35:11.370
7974
2015-03-16T08:35:11.370
2017-05-23T12:38:55.250
-1
4464
7966
answer