2015-01-28 29 views
30

Oldukça basit bir Spring Boot konsol tabanlı uygulama geliştiriyorsam, ana yürütme kodunun yerleştirilmesinden emin değilim. Ben public static void main(String[] args) yönteminde yerleştirin veya ana uygulama sınıfı run(String... args) yönteminde kod CommandLineRunner arabirimini uygulamak ve yerleştirmek zorunda mıdır?Spring Boot konsol tabanlı uygulama nasıl çalışır?

metinlerde gibi bir örnek kullanılacaktır.

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

public interface GreeterService { 
    String greet(String[] tokens); 
} 
: Aşağıdaki [ilkel] uygulaması (arayüzlere kodlanmış , stil) olması demek

GreeterServiceImpl.java (uygulama sınıfı)

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

Application.java eşdeğer Bahar Boot versiyonu çizgisinde bir şey olurdu: GreeterServiceImpl.java (uygulama sınıfı)

@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

Kullanım bunun için tasarlanmış budur bir 'CommandLineRunner' Bkz oluşturabilirsiniz: @jeton Laters anlaşılacağı gibi

Springboot düz bir uygular bunun bir örneği ve ona bağımlılıklar enjekte etti. Bu, ilk senaryonuzda, bir bağımlılık enjekte etmeyeceğiniz veya statik yöntemden erişemeyeceğiniz için başarısız olur. –

+0

@ M.Deinum, böylelikle konsol tabanlı uygulamalar CommandLineRunner arabirimini genel bir genel kural olarak uygulamalıdır? Bu benim için yeterli açıklığı sağlar, çünkü dokümanlar bile bu noktaya odaklanmaz (muhtemelen çoğu insan için gizli olduğu için!). –

+3

İdeal olarak, bu arayüzü uygulayan bir fasulye yaratın (ve “Uygulama” sınıfınızı değil). Endişelerin ayrılmasıyla (uygulamanızı başlatırken ve mantığınızı yürütürken) yapmak zorundadır. –

cevap

42

Sen olmalıdır standart bir yükleyici:

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

ve her zamanki SpringBoot büyü yapacak @Component açıklama

@Component 
    public class MyRunner implements CommandLineRunner { 

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

     } 
    } 

@EnableAutoConfiguration ile CommandLineRunner arabirimini uygular.

GÜNCELLEME:, ayrıca

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

docs at 72.2

+4

Neden Bahar Önyükleme kullanarak bir CLI uygulamasını uygulamanın doğru yolu olduğunu düşünüyorsunuz? 'CommandLineRunner' ve' ApplicationRunner' yalnızca CLI uygulamaları için kullanılmalıdır. Ayrıca, bunlardan herhangi birini kullandığınızda, Spring uygulamanızın ana işlevini başlatmadan önce "run" yöntemini "INFO 6961 --- [restartedMain] org.behrang.rpn.Main: XX.YYY saniyede ana (MMVNNN için çalışıyor) JVM '' CommandLineRunner.run (...) 'metodundaki koddan sonra görünecektir. – Behrang

+4

@Behrang Peki, o zaman bunu yapmanın doğru yolu nedir? – Wesam

+1

@Wesam Ne yazık ki bunu bildiğim için şık bir yol yok. İşte olası bir çözüm: https://gist.github.com/behrangsa/6a7f050e7f6d193918ad7e910812fb28 – Behrang