web-dev-qa-db-fra.com

Comment fonctionne une application basée sur la console Spring Boot?

Si je développe une application assez simple basée sur la console Spring Boot, je ne suis pas sûr de l'emplacement du code d'exécution principal. Dois-je le placer dans la méthode public static void main(String[] args) ou laisser la classe d'application principale implémenter l'interface CommandLineRunner et placer le code dans la run(String... args) méthode?

Je vais utiliser un exemple comme contexte. Disons que j'ai l'application [rudimentaire] suivante ( codée pour les interfaces, style Spring ):

Application.Java

public class Application {

  @Autowired
  private GreeterService greeterService;

  public static void main(String[] args) {
    // ******
    // *** Where do I place the following line of code
    // *** in a Spring Boot version of this application?
    // ******
    System.out.println(greeterService.greet(args));
  }
}

GreeterService.Java (interface)

public interface GreeterService {
  String greet(String[] tokens);
}

GreeterServiceImpl.Java (classe d'implémentation)

@Service
public class GreeterServiceImpl implements GreeterService {
  public String greet(String[] tokens) {

    String defaultMessage = "hello world";

    if (args == null || args.length == 0) {
      return defaultMessage;
    }

    StringBuilder message = new StringBuilder();
    for (String token : tokens) {
      if (token == null) continue;
      message.append(token).append('-');
    }

    return message.length() > 0 ? message.toString() : defaultMessage;
  }
}

La version équivalente de Spring Boot de Application.Java serait quelque chose du genre: GreeterServiceImpl.Java (classe d'implémentation)

@EnableAutoConfiguration
public class Application
    // *** Should I bother to implement this interface for this simple app?
    implements CommandLineRunner {

    @Autowired
    private GreeterService greeterService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        System.out.println(greeterService.greet(args)); // here?
    }

    // Only if I implement the CommandLineRunner interface...
    public void run(String... args) throws Exception {
        System.out.println(greeterService.greet(args)); // or here?
    }
}
37
Web User

Vous devriez avoir un chargeur standard:

@SpringBootApplication
public class MyDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyDemoApplication.class, args);
    }
}

et implémenter une interface CommandLineRunner avec @Component annotation

    @Component
    public class MyRunner implements CommandLineRunner {

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

      }
   }

@EnableAutoConfiguration fera la magie habituelle de SpringBoot.

MISE À JOUR:

Comme @jeton le suggère, Springboot implémente une suite:

spring.main.web-environment=false
spring.main.banner-mode=off

Voir docs at 72.2

50
lrkwz