web-dev-qa-db-ja.com

SpringApplication.run mainメソッド

Spring Starterプロジェクトテンプレートを使用してEclipseでプロジェクトを作成しました。

アプリケーションクラスファイルが自動的に作成され、そのパスはPOM.xmlファイルのパスと一致するため、すべて正常です。 Applicationクラスは次のとおりです。

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        //SpringApplication.run(ReconTool.class, args);  
        ReconTool.main(args);
    }
}

これは、私が構築しているコマンドラインアプリです。実行するには、SpringApplication.run行をコメントアウトして、実行する他のクラスのmainメソッドを追加する必要がありました。この簡単なjerry-rig以外に、Mavenを使用してビルドでき、Springアプリケーションとして実行されます。

ただし、その行をコメントアウトする必要はなく、完全なSpringフレームワークを使用する必要があります。これどうやってするの?

31
Alexander Mills

このメソッドはSpring Framework全体を起動するため、Application.run()を実行する必要があります。以下のコードは、main()をSpring Bootと統合します。

_Application.Java_

_@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
_

_ReconTool.Java_

_@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        main(args);
    }

    public static void main(String[] args) {
        // Recon Logic
    }
}
_

なぜSpringApplication.run(ReconTool.class, args)

この方法は、スプリングが完全に構成されていないためです(コンポーネントスキャンなどはありません)。 run()で定義されたBeanのみが作成されます(ReconTool)。

サンプルプロジェクト: https://github.com/mariuszs/spring-run-magic

53
MariuszS

を使用して:

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);  

        //do your ReconTool stuff
    }
}

あらゆる状況で機能します。 IDEからアプリケーションを起動するか、ビルドツールから起動するか。

Mavenを使用する場合は、単にmvn spring-boot:run

gradleではgradle bootRun

Runメソッドの下にコードを追加する代わりに、CommandLineRunnerを実装するSpring Beanがあります。次のようになります。

@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
       //implement your business logic here
    }
}

this Springの公式ガイドリポジトリのガイドをご覧ください。

完全なSpring Bootのドキュメントは here にあります。

11
geoand

もう1つの方法は、アプリケーションを拡張することです(私のアプリケーションは親を継承してカスタマイズすることでした)。親とそのコマンドラインランナーを自動的に呼び出します。

@SpringBootApplication
public class ChildApplication extends ParentApplication{
    public static void main(String[] args) {
        SpringApplication.run(ChildApplication.class, args);
    }
}
0
RamV