web-dev-qa-db-fra.com

Méthode principale SpringApplication.run

J'ai créé un projet dans Eclipse à l'aide du modèle de projet Spring Starter.

Il a automatiquement créé un fichier de classe Application et ce chemin correspond au chemin du fichier POM.xml. Tout va bien. Voici la classe d'application:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

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

Ceci est une application en ligne de commande que je suis en train de construire et afin de l'exécuter, je devais commenter la ligne SpringApplication.run et simplement ajouter la méthode principale de mon autre classe à exécuter . À part ce rapide jerry- Je peux le construire avec Maven et il fonctionne comme une application Spring, en quelque sorte.

Je préférerais toutefois ne pas commenter cette ligne et utiliser le cadre complet de Spring. Comment puis-je faire ceci?

27
Alexander Mills

Vous devez exécuter Application.run() car cette méthode lance tout le framework Spring. Le code ci-dessous intègre votre main() avec Spring Boot.

Application.Java

@Configuration
@ComponentScan
@EnableAutoConfiguration
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
    }
}

Pourquoi pas SpringApplication.run(ReconTool.class, args)

Parce que de cette façon, Spring n'est pas entièrement configuré (pas d'analyse de composant, etc.). Seul le bean défini dans run () est créé (ReconTool).

Exemple de projet: https://github.com/mariuszs/spring-run-magic

43
MariuszS

En utilisant:

@ComponentScan
@EnableAutoConfiguration
public class Application {

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

        //do your ReconTool stuff
    }
}

travaillera en toutes circonstances. Que vous souhaitiez lancer l'application à partir de l'EDI ou de l'outil de construction.

En utilisant maven, utilisez simplement mvn spring-boot:run

en grade, ce serait gradle bootRun

Une alternative à l'ajout de code dans la méthode d'exécution consiste à avoir un bean Spring implémentant CommandLineRunner. Cela ressemblerait à:

@Component
public class ReconTool implements CommandLineRunner {

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

Découvrez this guide dans le référentiel de guides officiel de Spring.

La documentation complète de Spring Boot est disponible ici

11
geoand

Une autre méthode consiste à étendre l’application (mon application devait hériter et personnaliser le parent). Il appelle automatiquement le parent et son commandlinerunner.

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