Help us understand the problem. What is going on with this article?

@SpringBootApplication利用上の注意

More than 5 years have passed since last update.

前回、RabbitMQの実装をしていて気づいたのですが、
@SpringBootApplicationアノテーションを付与したmainメソッドを持つクラスを1つのProjectに2つ用意した場合に同時に動くという事がわかりました。
知らないで利用しているとちゃんと動いているのか不安になるのですが、知っていればフロントエンドとバックエンドを一つのインスタンスでまかなえるという事に気づいたりします。

http://stackoverflow.com/questions/33612130/multiple-springbootapplication-annotation-in-a-project

STSではメインメソッドが複数ある場合に下記のように選択でき、build.gradleでも起動時のメインメソッドを指定できるので、サンプル用に1つのプロジェクト内に沢山のメインメソッドを入れていました。
スクリーンショット 2015-11-09 23.57.29.png

こっちがもともとあるフロント用のクラスです。
@SpringBootApplication
@Configuration,@EnableAutoConfiguration,@ComponentScanを呼び出します。
@ComponentScan@Componentを全部使えるようにしてくれるので、@Componentを含む@Controllerが有効になります。

SpringDemoApplication.java
package demo;

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

@SpringBootApplication
public class SpringDemoApplication {

public static void main(String[] args) {

        SpringApplication application = new SpringApplication(SpringDemoApplication.class);
        ApplicationContext context = application.run(args);

    }
}

あとから、バックグラウンド用の処理に追加したクラス。
タイマーなどを組み合わせるとより正確に定期実行のタスクを簡単にプロジェクト内に組み込む事ができます。
ウェブの機能が入っているのと同じJARファイル内で動いています。

@Component
```java:BackgroundTasks.java
package demo;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class BackgroundTasks implements CommandLineRunner {

@Autowired
ApplicationContext context;

public static void main(String[] args) throws InterruptedException {
    SpringApplication.run(RabbitMQApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
    System.out.println("Waiting five seconds...");

    while(0 < 1){
        for(int i = 0 ; i < 5 ; i++){
            System.out.println(new Date().toGMTString() + ": " + String.valueOf(i));
        }
        Thread.sleep(10000);
    }
}

}
```

訂正
@SpringBootApplicationではなく、
@ComponentとCommandLineRunnerが実装されている場合に、同じインスタンス内で起動してるみたいです。

MariMurotani
フルスタックエンジニアとして17年働いています。Qiitaはメモ用にはじめました。 最近はRailsとフロントとAWS少しとCI少し。 ガラケーからスマフォに移行した全盛期をフルスタックエンジニアとして自社サービス開発をしながら過ごし、その後ブリッジSEやPM業をしながらシステム開発分野・ウェブサービス事業などで働いています。最近は少しゆっくりRailsを中心に勉強中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away