2012-08-30 9 views
13

मैं जावा आधारित config उपयोग कर रहा हूँ इस तरह मेरी स्प्रिंग आवेदन संदर्भ स्थापित करने के लिए:वसंत में @ComponentScan के साथ सभी बीन्स को आलसी कैसे लोड करें?

@Configuration 
@Lazy 
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) 
public class MyAppConfig { 
    ... 
} 

बीन्स config में स्पष्ट रूप से परिभाषित, lazily भरी हुई है जैसे आप अपेक्षा करते हैं। हालांकि, स्कैन किए गए वर्ग @Named के साथ एनोटेटेड हमेशा उत्सुकता से लोड होते हैं। इसे कैसे हल किया जा सकता है?

किसी भी मदद की सराहना की जाती है।


ध्यान दें कि MyProject पैकेज में कक्षाओं के लिए, मैं उन्हें @Lazy साथ के रूप में अच्छी व्याख्या इस पर काम कर सकते हैं। लेकिन दूसरी परियोजना में वसंत की निर्भरता नहीं है और मैं इसे इस तरह रखना चाहता हूं (इसलिए @Named और @Component नहीं)।


ध्यान दें कि यह XML- आधारित कॉन्फ़िगरेशन में कोई समस्या नहीं है। वहां, <beans> टैग सीम में default-lazy-init="true" सेट करना जो मैं चाहता हूं (हालांकि मैंने इसका परीक्षण नहीं किया है)।

+3

इतना छोटा है '<सेम जोड़ने का प्रयास करें डिफ़ॉल्ट-आलसी-init = "सत्य" /> 'एक्सएमएल फ़ाइल और जावा कॉन्फ़िगरेशन में बाकी छोड़ दें। यदि '@ कॉन्फ़िगरेशन' के साथ ऐसा करने का कोई तरीका नहीं है, तो [कोई समस्या उठाएं] (https://jira.springsource.org/secure/Dashboard.jspa) में संकोच न करें। –

+0

इसे जांचें: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/annotation/Lazy.html – Elbek

+2

इस पर एक बग रिपोर्ट खुलती है: https: // jira.spring.io/browse/SPR-10459 –

उत्तर

12

संस्करण 4.1 RC2 के रूप में, इस बग तय हो गई है, और आप के साथ घटक स्कैन पर आलसी लोड हो रहा है पूरा कर सकते हैं:

@ComponentScan(basePackages = ["..."], lazyInit = true) 

https://jira.spring.io/browse/SPR-10459

+0

बहुत बढ़िया। यह मेरी जूनिट कॉन्फ़िगरेशन को सरल बनाने में मदद करता है। – Basil

2

जैसा कि आपने कहा था कि इसे संभालने का कोई सीधा तरीका नहीं है (कॉन्फ़िगरेशन क्लास में @Lazy का उपयोग करके)। लेकिन आप इस दृष्टिकोण के साथ प्रयास कर सकते हैं:

मुझे लगता है कि अन्य प्रोजेक्ट एक ऐसी परियोजना है जो वसंत का उपयोग नहीं कर रही है, और कल्पना करें कि इन वर्गों को एनोटेट नहीं किया गया है।

तो फिर तुम MyProject में एक विन्यास है कि उस तरह लग रहा है परिभाषित करना चाहिए:

@Configuration 
// Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject") 
public class MyProjectConfig { 

    @Bean(name = "lazyBean") 
    @Lazy 
    public LazyBean lazyBean(){ 
     System.out.println("Loading LazyBean bean"); 
     return new LazyBean(); // Or use a static method factory, this is only an example 
    } 
} 

इस, सेम का उपयोग करना "lazyBean" जब कुछ उदाहरण यह इंजेक्षन या जब आप स्पष्ट रूप से इसे कहते बनाया जाएगा, लेकिन कम से कभी नहीं init समय।

कृपया ध्यान दें कि आपको प्रति वर्ग एक नया बीन परिभाषित करने की आवश्यकता है जिसे आप उपयोग करना चाहते हैं, इसलिए यदि आपके पास कई वर्ग हैं लेकिन आपके अन्य प्रोजेक्ट की कक्षाओं की पहुंच को कम करने के लिए अच्छा है तो यह अच्छा नहीं है (शायद आपके सभी नहीं कक्षाएं आवश्यक हैं)।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

असल में, अन्य प्रोजेक्ट के वर्ग * एनोटेटेड हैं, लेकिन '@ नामांकित 'के साथ। इसलिए, मैं '@ घटक स्कैन 'का लाभ लेना चाहता था और सभी बीन्स को स्पष्ट रूप से परिभाषित करने से बचाना चाहता था। लेकिन आपके समय के लिए धन्यवाद, मैं आपका जवाब स्वीकार करूंगा। – rolve

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