2016-04-12 6 views

उत्तर

-1

एडम बिएन द्वारा Article में पीछे की अवधारणाओं का एक अच्छा स्पष्टीकरण दिया गया है।

+1

शायद मैं कर रहा हूँ केवल एक ही लेकिन इस लेख मेरे लिए काफी अच्छा नहीं था अंतर को समझाने में। – kukis

+0

लिंक किए गए आलेख में ओपी के बारे में पूछे जाने वाले एनोटेशन में से कोई भी उल्लेख नहीं किया गया है। –

0

चूंकि स्वीकृत उत्तर ने मेरी समस्या का समाधान नहीं किया है, इसलिए मैंने अपना उत्तर पोस्ट किया है। यह एडम बिएन द्वारा लेख के रूप में के रूप में अच्छा नहीं होगा, लेकिन निश्चित रूप से और अधिक व्यावहारिक हो जाएगा:

कोड निम्नलिखित पर विचार करें:

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 

@Singleton 
public class DatabaseConnection { 

    @PostConstruct 
    public void init() { 
     System.out.println("init"); 
    } 

    public ChampionComp getFirstRecord() { 
     return new ChampionComp("Ashe", "Teemo", "Warwick", 
       "Blitzcrank", "Syndra", "Anivia", "Brand", "Rammus", "Xin Zhao", "Irelia"); 
    } 

} 

और यह बाकी सेवा:

import javax.inject.Inject; 
import javax.ws.rs.GET; 
import javax.ws.rs.Produces; 
import javax.ws.rs.Path; 

@Path("/champions") 
public class ChampionsAPI { 

    @Inject 
    private DatabaseConnection db; 

    @GET 
    @Produces("text/plain") 
    public String getClichedMessage() { 
     ChampionComp comp = db.getFirstRecord(); 
     return comp.toString(); 
    } 
} 

javax.ejb.Singleton इस कोड का उपयोग करना बस ठीक काम करता है। DatabaseConnection उदाहरण एक बार बनाया गया है और आरईएसटी सेवा में इंजेक्शन दिया गया है। हालांकि ejb को inject के साथ आयात में बदलते समय आपको डीबी फ़ील्ड तक पहुंचते समय चैंपियंसएपी कक्षा में एनपीई प्राप्त होगा - ऐसा इसलिए है क्योंकि आपका सिंगलटन नहीं बनाया गया था (किसी कारण से, शायद javax.inject.Singleton का उपयोग करते समय इंटरफ़ेस का उपयोग करने की आवश्यकता है?)।

+1

यह सिंगलटन पैकेज की समस्या नहीं है बल्कि एक सीडीआई खोज मुद्दा है। सीडीआई आपके मामले में "सक्रिय" नहीं है। यदि सीडीआई सही ढंग से सक्रिय है (beans.xml, आदि का उपयोग कर) इंजेक्शन सही ढंग से काम करेगा। – Rouliboy

3

मैं एक प्रशंसनीय विवरण here पाया:

डिफ़ॉल्ट रूप से, javax.ejb.Singleton सत्र सेम व्यवहार (EJB 3.1 विनिर्देश की धारा 13.3.7) और (हर व्यवसाय विधि मंगलाचरण के लिए एक विशेष लॉक के अधिग्रहण की आवश्यकता होती है वर्गों 4.8.5.4 और 4.8.5.5)।

इसके विपरीत, javax.inject.Singleton लेनदेन नहीं है और कंटेनर-प्रबंधित समेकन का समर्थन नहीं करता है (मुख्य परिणाम यह है कि कंटेनर द्वारा लॉकिंग योजना लागू नहीं की जाती है)। [...]

यदि आपको ईजेबी सुविधाओं की आवश्यकता नहीं है, तो @ApplicationScoped (javax.inject.Singleton के साथ चिपकाएं सीडीआई द्वारा परिभाषित नहीं किया गया है, और इसके अर्थशास्त्र इसलिए उस विनिर्देशन द्वारा शासित नहीं हैं)।

भविष्य भ्रम को कम करने के लिए, मैं इस छोटी इकाई परीक्षण का उपयोग करें (प्रथम स्तर पैकेज का नाम बदला जाना आवश्यक):

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; 

import com.tngtech.archunit.core.domain.JavaClasses; 
import com.tngtech.archunit.core.importer.ClassFileImporter; 

import org.junit.Test; 

public class SingletonTest { 

    /** requires com.tngtech.archunit:archunit-junit:0.4.0 */ 
    @Test 
    public void detectWrongSingletonAnnotation() { 

     final ClassFileImporter importer = new ClassFileImporter(); 
     final JavaClasses classes = importer.importPackages("first_level_package"); 

     noClasses().should().beAnnotatedWith("javax.inject.Singleton") 
       .as("Please use javax.ejb.Singleton instead of javax.inject.Singleton.") 
       .check(classes); 
    } 
} 
संबंधित मुद्दे