2015-01-28 19 views
30

Jeśli opracowuję raczej prostą aplikację konsolową Spring Boot, nie jestem pewien co do położenia głównego kodu wykonawczego. Należy umieścić go w metodzie public static void main(String[] args), lub główny wniosek klasy implementują interfejs CommandLineRunner i umieścić kod w metodzie run(String... args)?Jak działa konsola Spring Boot?

Użyję przykładu jako kontekstu. Powiedzieć, że mają następujący [podstawową] Zgłoszenie (zakodowany interfejsów, Spring stylu):

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 (interfejs)

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

GreeterServiceImpl.java (klasa realizacja)

@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; 
    } 
} 

Równowartość wersja Wiosna Boot Application.java byłoby coś wzdłuż linii: GreeterServiceImpl.java (klasa realizacja)

@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? 
    } 
} 
+3

użyć 'CommandLineRunner' czyli co to jest przeznaczone do, można również tworzyć jest jego instancją i ma wstrzyknięte do niego zależności. W twoim pierwszym scenariuszu nie udałoby się tego, ponieważ nie miałbyś wstrzykniętej zależności lub nie byłbyś w stanie uzyskać do niej dostępu z metody statycznej. –

+0

@ M.Deinum, więc takie aplikacje oparte na konsoli muszą implementować interfejs CommandLineRunner jako ogólną regułę? To zapewnia mi wystarczającą jasność, ponieważ nawet dokumenty nie koncentrują się na tej kwestii (prawdopodobnie dlatego, że jest to nieodłączne dla większości ludzi!). –

+3

Idealnie tworzysz komponent bean, który implementuje ten interfejs (a nie twoją klasę "Application"). Ma to związek z rozdzielaniem spraw (uruchamianie aplikacji i wykonywanie logiki). –

Odpowiedz

42

powinieneś standardowy ładowacz:

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

i wdrożenie CommandLineRunner interfejs @Component adnotacji

@Component 
    public class MyRunner implements CommandLineRunner { 

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

     } 
    } 

@EnableAutoConfiguration zrobi zwykły SpringBoot magii.

UPDATE:

Jak @jeton sugeruje Laters Springboot implementuje prosty:

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

Zobacz docs at 72.2

+4

Dlaczego uważasz, że jest to właściwy sposób wdrożenia aplikacji CLI przy użyciu Spring Boot? 'CommandLineRunner' i' ApplicationRunner' są nie tylko przeznaczone do aplikacji CLI. Dodatkowo, jeśli użyjesz któregoś z nich, Spring uruchomi odpowiednią metodę "run" przed uruchomieniem metody "głównej" aplikacji, co widać po komunikacie "INFO 6961 --- [restartedMain] org.behrang.rpn.Main: Uruchomiono Main w XX.YYY sekund (JVM uruchomiona dla MM.NNN) 'pojawia się po wykonaniu kodu w twojej metodzie' CommandLineRunner.run (...) '. – Behrang

+4

@Behrang Więc jaki jest właściwy sposób, aby to zrobić? – Wesam

+1

@Wesam Niestety nie ma eleganckiego sposobu na zrobienie tego, co wiem. Oto możliwe rozwiązanie: https://gist.github.com/behrangsa/6a7f050e7f6d193918ad7e910812fb28 – Behrang