2015-01-28 8 views
30

यदि मैं एक साधारण स्प्रिंग बूट कंसोल-आधारित अनुप्रयोग विकसित कर रहा हूं, तो मैं मुख्य निष्पादन कोड की नियुक्ति के बारे में अनिश्चित हूं। मैं public static void main(String[] args) विधि में रखें, या मुख्य आवेदन वर्ग CommandLineRunner इंटरफ़ेस को लागू और run(String... args) विधि में कोड होना चाहिए?स्प्रिंग बूट कंसोल आधारित एप्लिकेशन कैसे काम करता है?

मैं संदर्भ के रूप में एक उदाहरण का उपयोग करूंगा।

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 (इंटरफेस)

public interface GreeterService { 
    String greet(String[] tokens); 
} 
: मैं निम्नलिखित [अल्पविकसित] आवेदन ( इंटरफेस के लिए कोडित, स्प्रिंग शैली) है कहो

GreeterServiceImpl.java (कार्यान्वयन वर्ग)

@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 के बराबर स्प्रिंग बूट संस्करण पंक्तियों के साथ कुछ होगा: GreeterServiceImpl.java (कार्यान्वयन वर्ग)

@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

उपयोग एक 'CommandLineRunner' वह यह है कि क्या है यह के लिए बनाया गया देखें, तो आप भी बना सकते हैं:

@jeton laters से पता चलता है Springboot एक सीधे लागू करता है इसका एक उदाहरण और इसमें निर्भरताएं शामिल हैं। यह आपके पहले परिदृश्य में असफल हो जाएगा क्योंकि आपके पास निर्भरता इंजेक्शन नहीं होगी या स्थिर विधि से इसे एक्सेस नहीं कर पाएगी। –

+0

@ एम। डीनियम इस तरह के कंसोल-आधारित अनुप्रयोगों को कमांड के सामान्य नियम के रूप में कमांडलाइनर इंटरफ़ेस को कार्यान्वित करना होगा? यह मेरे लिए पर्याप्त स्पष्टता प्रदान करता है, क्योंकि दस्तावेज़ भी इस बिंदु पर ध्यान केंद्रित नहीं करते हैं (शायद क्योंकि यह ज्यादातर लोगों के लिए निहित है!)। –

+3

वैसे आप आदर्श रूप से एक बीन बनाते हैं जो इस इंटरफेस को लागू करता है (और आपकी 'एप्लिकेशन' कक्षा नहीं)। इसे चिंताओं को अलग करने के साथ करना है (अपना आवेदन शुरू करना और अपना तर्क निष्पादित करना)। –

उत्तर

42

आप होना चाहिए एक मानक लोडर:

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

और @Component एनोटेशन

@Component 
    public class MyRunner implements CommandLineRunner { 

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

     } 
    } 

@EnableAutoConfiguration के साथ एक CommandLineRunner इंटरफ़ेस को लागू सामान्य SpringBoot जादू करेंगे।

अद्यतन:

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

docs at 72.2

+4

आपको लगता है कि स्प्रिंग बूट का उपयोग कर सीएलआई एप्लिकेशन को लागू करने का यह सही तरीका क्यों है? 'कमांडलाइनरनर' और 'एप्लिकेशनरनर' का उपयोग केवल सीएलआई ऐप्स के लिए नहीं किया जाना है। इसके अलावा, जब आप उनमें से किसी एक का उपयोग करते हैं, तो स्प्रिंग लॉग ऐप 'INFO 6961 --- [restartedMain] org.behrang.rpn द्वारा स्पष्ट रूप से आपके ऐप की' मुख्य 'विधि शुरू करने से पहले अपनी संबंधित' रन 'विधि निष्पादित करता है। मुख्य: XX.YYY सेकेंड में मुख्य प्रारंभ किया गया (जेएमएम एमएमएनएनएन के लिए चल रहा है) 'आपके' CommandLineRunner.run (...) 'कोड में कोड के बाद दिखाई दे रहा है। – Behrang

+4

@ बेहरांग तो फिर ऐसा करने का उचित तरीका क्या है? – Wesam

+1

@ वेसम दुर्भाग्यवश ऐसा करने का एक शानदार तरीका नहीं है जिसे मैं जानता हूं। यहां एक संभावित समाधान है: https://gist.github.com/behrangsa/6a7f050e7f6d193918ad7e910812fb28 – Behrang

संबंधित मुद्दे