2013-08-19 11 views
17

में एनानेटेड बीन डिस्कवरी मोड का अर्थ मैं जावा ईई 7 पर एक एप्लीकेशन माइग्रेट कर रहा हूं और सीडीआई 1.1 चाहता हूं। लेकिन मुझे bean-discovery-mode="annotated" का अर्थ नहीं मिला है। CDI 1.1 specification बहुत उपयोगी नहीं है। कम से कम मुझे कोई उपयोगी अनुच्छेद नहीं मिला है। क्या मुझे याद आया?सीडीआई 1.1

यह उदाहरण bean-discovery-mode="all" साथ पूरी तरह से चलाता है और LoggingClass का एक उदाहरण injects:

public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 

} 

@Test 
public class MMLoggerProducerIT extends Arquillian { 

    @Inject private LoggingClass lc; 

} 

लेकिन अगर मैं bean-discovery-mode="all" से bean-discovery-mode="annotated" को बदलने के कंटेनर क्षेत्र lc में एक उदाहरण इंजेक्षन करने में सक्षम नहीं है।

का उपयोग करने के लिए मुझे LoggingClass पर एनोटेट करना होगा?

+0

मैं केवल अनुमान लगा रहा हूं, लेकिन मुझे लगता है कि '@ नामित' या 'मैनेगेडबीन' उम्मीदवार होंगे? –

+1

@Mike_Braun नामांकित केवल ईएल संदर्भ में एक बीन का पर्दाफाश करेगा, लेकिन यह एक गुंजाइश नहीं देगा। प्रबंधित बीन एक जेएसएफ एनोटेशन है, सीडीआई इंजन इसे अनदेखा कर देगा। – Yuri

उत्तर

27

एक व्यावहारिक मामले के रूप में, bean-discovery-mode="ALL" एक संग्रह में सभी वर्गों की स्कैनिंग चालू करता है। इसे "स्पष्ट संग्रह" कहा जाता है।

beans.xml को छोड़कर, या bean-discovery-mode="ANNOTATED" सेटिंग, संग्रह को एक निहित संग्रह बनाता है। इस मामले में, कंटेनर एनोटेटेड स्कोप प्रकारों के साथ सेम के लिए स्कैन करेगा।

यह बताता है कि को bean-discovery-mode="ANNOTATED" सेट करते समय इंजेक्शन क्यों नहीं दिया जाता है। जैसा कि जावा ईई 7 ट्यूटोरियल में प्रलेखित है:

सीडीआई केवल एक निहित संग्रह में एक दायरे के प्रकार के साथ एनोटेटेड बीन्स का प्रबंधन और इंजेक्ट कर सकता है।

संपादित करें: तो बस बिल्कुल स्पष्ट होने के लिए, आपको LoggingClass पर एक स्कोप प्रकार जोड़ने की आवश्यकता है। तो कुछ इस तरह:

@SessionScoped 
public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 
} 

जावा ईई 7 में और CDI 1.1, हम आवश्यकता beans.xml तैनाती वर्णनकर्ता एक संग्रह के लिए CDI चालू करने के लिए शामिल करने के लिए हटा दिया, अधिकांश अन्य जावा ईई एपीआई जहां के साथ लाइन में CDI 1.1 लाने तैनाती वर्णनकर्ता वैकल्पिक हैं। इसने beans.xml सहित या नहीं, की बाइनरी चालू/बंद प्रकृति को भी हटा दिया। bean-discovery-mode में सेटिंग्स के साथ कंटेनर द्वारा कौन सी फाइल स्कैन की जाती है, इसे नियंत्रित कर सकते हैं।

यहाँ CDI अनुप्रयोगों पैकेजिंग पर JavaEE ट्यूटोरियल देखें: http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE

+0

यदि कोई 'beans.xml' नहीं है, तो इंटरसेप्टर और सजावटी कैसे पंजीकृत हैं और आदेश दिए गए हैं? क्या उधर रास्ता है? – noinstance

+1

@ नोसचनिक इंटरसेप्टर्स को '@ इंटरसेप्टर' और 'प्राथमिकता 'का उपयोग करके एनोटेशन के माध्यम से आदेश दिया जा सकता है, जैसा कि वर्णन किया गया है [धारा 54.2.5 में] (http://docs.oracle.com/javaee/7/tutorial/doc/interceptors002 .htm # GKHNI)। –

+0

क्या यह वर्णन करता है कि @Produces कैसे काम कर रहे हैं? क्या फैक्ट्री क्लास में मुझे एक एनोटेशन करना है? –

23

एक सेम को परिभाषित करने एनोटेशनare discovered साथ bean-discovery-mode="annotated" केवल कक्षाओं का उपयोग करते समय। अन्य सभी वर्गों को नजरअंदाज कर दिया जाता है। कोई भी दायरा प्रकार एक बीन परिभाषित एनोटेशन है। यदि एक बीन वर्ग पर एक स्कोप प्रकार घोषित किया जाता है, तो बीन कक्षा को बीन परिभाषित एनोटेशन [spec] कहा जाता है। 1.1 spec यहां पूरी तरह से स्पष्ट नहीं है। केवल @NormalScope स्कोप या @Dependent छद्म स्कोप वाले वर्गों की खोज की गई है, @javax.inject.Singleton और अन्य सभी @Scope (छद्म) स्कॉप्स are ignored

ध्यान दें कि "बीन परिभाषित एनोटेशन" की परिभाषा सीडीआई 1 में बदल गई है।2 और अब बहुत अच्छी तरह से परिभाषित किया गया है:

सेम को परिभाषित करने टिप्पणियों का सेट होता है:

  • @ApplicationScoped, @SessionScoped, @ConversationScoped और एनोटेशन @RequestScoped,
  • अन्य सभी सामान्य दायरे प्रकार,
  • @Interceptor और @Decorator एनोटेशन,
  • सभी स्टीरियोटाइप एनोटेशन (यानी एनोटेशन @Stereotype साथ एनोटेट), और @Dependent गुंजाइश एनोटेशन।
+1

यह स्वीकार्य उत्तर होना चाहिए। – Chris

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