2014-05-01 8 views
5

को HK2 @Service javadocसेवा लोकेटर को @Service और @ HK2 में स्वचालित रूप से संपर्क कैसे मिलता है?

एनोटेशन कक्षाएं कि स्वचालित रूप से एक hk2 ServiceLocator को जोड़ा गया हो रहे हैं पर रखा अनुसार।

मुझे नहीं पता कि ServiceLocator स्वचालित रूप से एनोटेटेड कक्षाएं कैसे ढूंढें।

TestService

@Contract 
public interface TestService { 

} 

TestServiceImpl

@Service 
public class TestServiceImpl implements TestService { 

} 

मुख्य

public static void main(String[] args) { 
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

    TestService service = locator.getService(TestServiceImpl.class);  
    System.out.println(service); // null 
} 

परिणाम alway है एस null। मुझे Descriptor जोड़ना है ताकि ServiceLocator इसे मिल सके।

public static void main(String[] args) { 
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

    DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class); 
    DynamicConfiguration config = dcs.createDynamicConfiguration(); 
    config.bind(BuilderHelper.link(TestServiceImpl.class).to(TestService.class).in(Singleton.class).build()); 
    config.commit(); 

    TestService service = locator.getService(TestServiceImpl.class);  
    System.out.println(service); // TestServiceImpl instance 
} 

मैं ServiceLocator स्वचालित रूप से एनोटेटेड कक्षाओं को कैसे ढूंढूं? क्या मैंने कुछ गलत समझा?

उत्तर

5

सेवाओं की स्वचालित पहचान प्राप्त करने के लिए आपको अपने निर्मित कक्षाओं पर hk2-inhabitant-generator चलाने की आवश्यकता है। here पर भी अधिक जानकारी है।

बिल्ड प्रक्रिया में यह कदम क्या है सेवाओं के बारे में जानकारी के साथ मेटा-आईएनएफ/एचके 2-लोकेटर/डिफ़ॉल्ट नाम की एक फ़ाइल बनाना है। CreateAndPopulateServiceLocator कॉल तब उन फ़ाइलों को पढ़ता है और स्वचालित रूप से उन सेवा डिस्क्रिप्टर को वापस लौटाए गए सर्विसलोकेटर में जोड़ता है।

https://github.com/VA-CTT/HK2Utilities

ग्रहण/Maven/निवासी क्रम के बाद से:

+2

इसके अपडेट के रूप में अब एचके 2 मेटाडेटा जेनरेटर का उपयोग करना आसान है। आपको बस इतना करना है कि इसे अपने क्लासपाथ में रखा जाए। यहां अधिक जानकारी: https://hk2.java.net/2.4.0-b16/inhabitant-generator.html – jwells131313

+0

विशेष रूप से इस उत्तर से संबंधित नहीं है, लेकिन मैं कुछ दिनों से HK2 के बारे में कुछ शोध कर रहा हूं और हर बार मुझे लगता है वास्तविक जानकारी/सहायता के लिंक हमेशा इस प्रारंभ पृष्ठ पर उतरते हैं https://javaee.github.io/hk2/ जो कि उपयोगी नहीं है :( – A4L

5

FYI करें, मैं नहीं बल्कि एनोटेट वर्गों के क्रम स्कैनिंग के लिए क्षमता की तुलना में निवासी फ़ाइलों पर निर्भरता के साथ इतना निराश था, मैं इस परियोजना में लिखा था जनरेटर अच्छा नहीं खेलेंगे, कोड को डीबग करना लगभग असंभव था जिसने बिना किसी रनटाइम स्कैनिंग के ग्रहण में एचके 2 का उपयोग किया।

HK2Utilities पैकेज केंद्रीय में उपलब्ध है:

<dependency> 
    <groupId>gov.va.oia</groupId> 
    <artifactId>HK2Utilities</artifactId> 
    <version>1.4.1</version> 
</dependency> 

इसका इस्तेमाल करने के लिए आपको सिर्फ फोन:

ServiceLocator locator = HK2RuntimeInitializer.init("myName", false, new String[]{"my.package.one", "my.package.two"}); 

यह सूचीबद्ध संकुल में कक्षाओं के लिए क्रम classpath को स्कैन करेगा, और स्वत: ही बस उनके साथ सेवा लोकेटर।

आपको इस मॉडल के साथ कभी भी निवासियों को उत्पन्न करने की ज़रूरत नहीं है - और व्यावहारिक रूप से, मैंने पाया कि यह निवास प्रसंस्करण कोड से भी तेज प्रदर्शन कर रहा है (यह नहीं कि प्रदर्शन एक बार के ऑपरेशन के लिए बहुत मायने रखता है)

+0

कई बार अपवर्तित करने में सक्षम होना चाहते हैं। बहुत बहुत धन्यवाद HK2Utilities के लिए! – zyexal

+0

वाह यह बहुत gr8 है। क्या आप संभवतः इसे hk2 में योगदान देने पर विचार करेंगे? – jwells131313

+0

मुझे खुशी होगी, लेकिन यह सुनिश्चित नहीं होगा कि यह हल्का वजन HK2 पैकेज में वांछित चीज की तरह था - यह यह भी एक और निर्भरता में खींचता है जो वास्तव में एनोटेशन स्कैनिंग करता है। यह थोड़ी देर तक हो सकता है जब तक कि मुझे पुल अनुरोध को एक साथ रखने के लिए पर्याप्त मुक्त चक्र नहीं मिल जाते। – user2163960

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