聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

単純なSpring Applicationで、コマンドラインから動かしたい処理を指定する方法

これは何

単純なSpring Applicationで、コマンドラインから動かしたい処理を指定する方法のメモ。

やりたいこと

  • Spring Batchではない、通常のコマンドラインアプリケーション。
  • Spring資源を使いたい。
  • 起動する処理は引数で指定したい。

方法

  • SpringApplication.runの戻り値でApplicationContextが取得できる。
  • ApplicationContext.getBean(bean名称)で動かしたいBeanが取得できる。

ソース

Gist多田さんに教えてもらった記述をほぼそのままコピペしている。

Componentの名前を指定しない時

package ta.su.simple;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);

    //context.containsBean(bean名称) でそのBeanが存在するか事前にチェックが出来る。
        if(!context.containsBean("cBean")) {
            throw new IllegalArgumentException("不正なBean名を指定した");
        }

    //Bean名称はクラス名称と同一になる。
        Bean bean = context.getBean("ABean", Bean.class);
        bean.run();
    }

}

interface Bean {
    public void run();
}

@Component
class ABean implements Bean {

    @Override
    public void run() {
        System.out.println("aBeanが呼ばれた");
    }
}

@Component
class BBean implements Bean {

    @Override
    public void run() {
        System.out.println("bBeanが呼ばれた");
    }
}

Componentの名前を指定する時

package ta.su.simple;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        
        if(!context.containsBean("cBean")) {
            throw new IllegalArgumentException("不正なBean名を指定した");
        }
        
    //Bean名称はComponentアノテーションで指定した名称になる。
        Bean bean = context.getBean("aBean", Bean.class);
        bean.run();
    }

}

interface Bean {
    public void run();
}

@Component("aBean")
class ABean implements Bean {

    @Override
    public void run() {
        System.out.println("aBeanが呼ばれた");
    }
}

@Component("bBean")
class BBean implements Bean {

    @Override
    public void run() {
        System.out.println("bBeanが呼ばれた");
    }
}