2010-05-13 13 views
8

मैं फैक्ट्रीबीन और स्कॉप्स का एक साथ उपयोग करना चाहता हूं। विशेष रूप से, मैं एक फैक्ट्रीबीन द्वारा बनाई गई वस्तु को एक निश्चित (शायद कस्टम) दायरे में रखा जाना चाहता हूं। मुद्दा यह है कि निम्न कार्य है:स्प्रिंग फैक्ट्रीबीन और स्कॉप्स एक साथ काम कर रहे हैं

FactoryBean ही सीमित किया जा रहा में
<bean class="x.y.z.TestFactoryBean" scope="test" /> 

परिणाम, और कारखाने के द्वारा बनाई गई वस्तु पर कुछ हद तक अप्रत्याशित व्यवहार है। मैं समझता हूं कि यह क्यों है; फैक्ट्री स्वयं एक प्रथम श्रेणी के वसंत-प्रबंधित बीन है, और इसका अपना जीवन चक्र है। हालांकि, मुझे यह निर्दिष्ट करने का कोई तरीका नहीं मिल रहा है कि कारखाने से लौटाई गई वस्तु को स्वयं ही स्कॉप्ड किया जाना चाहिए।

दूसरी ओर, वास्तव में यह करता है जो मैं चाहता है (जब तक TestFactoryBean FactoryBean इंटरफ़ेस को लागू नहीं करता है के रूप में):

<bean class="x.y.z.TestFactoryBean" name="testFactory"> 
<bean class="x.y.z.TestBean" factory-bean="testFactory" 
     factory-method="getObject" scope="test" /> 

तो असली सवाल यह है कि, मैं वसंत से व्यवहार करते हैं जैसे यह होता है कि कैसे कर सकते हैं ऊपर के दूसरे उदाहरण के लिए, लेकिन असली फैक्टरी बीन का उपयोग कर?

उत्तर

6

आप FactoryBean से लौटाए गए बीन पर आसानी से कस्टम स्कोप का उपयोग नहीं कर सकते हैं।

वसंत के Java documentation से

: यदि आप चाहते हैं FactoryBean के सेम लौटे प्रोटोटाइप गुंजाइश है करने के लिए है, तो आप isSingleton() विधि इस तरह लागू करना चाहिए

FactoryBeans एकमात्र और प्रोटोटाइप

समर्थन कर सकते हैं :

public class TestFactoryBean implements FactoryBean<TestBean> { 

    // the rest of the required methods are removed for simplicity reasons.. 

    public boolean isSingleton() { 
     return false; 
    } 
} 

कस्टम दायरे का समर्थन करने के लिए, आपके पास है तर्क को स्वयं लागू करने के लिए और यह बहुत सहज नहीं होगा, क्योंकि FactoryBean केवल isSingleton() विधि प्रदान करता है। मैं कस्टम स्कोप के साथ बीन्स के लिए FactoryBean से दूसरे समाधान का उपयोग करने की सलाह दूंगा।

आशा है कि इससे मदद मिलती है!

+1

आप वसंत में बहुत अधिक सब कुछ अनुकूलित कर सकते हैं, इसलिए मुझे लगता है कि यह किसी भी तरह से संभव है, लेकिन इसमें शायद कुछ बहुत गहरी खुदाई (कस्टम एप्लिकेशन कॉन्टेक्स्ट का उपयोग करके) या ऐसा कुछ शामिल होगा। लेकिन मैं अनुमान लगा रहा हूं –

+0

मैं सहमत हूं और अपना जवाब अपडेट कर चुका हूं। – Espen

2

मैंने कस्टम धारक बीन का उपयोग करके एक ही समस्या हल की।

फैक्टरी सेम:

@Component 
@Configurable() 
public class EventBusFactory implements FactoryBean<EventBus> { 
    @Override 
    public EventBus getObject() throws Exception { 
     return new SimpleEventBus(); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return EventBus.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return false; 
    } 
} 

बीन धारक:

@Configurable 
@Component 
@Scope("session") 
public class EventBusHolder { 

    @Autowired 
    private EventBus eventBus; 

    public EventBus getEventBus() { 
     return eventBus; 
    } 

    public void setEventBus(EventBus eventBus) { 
     this.eventBus = eventBus; 
    } 
} 

और फिर मैं आवश्यक इकाई के बजाय धारक का उपयोग करें।

@Component 
@Configurable 
@Scope("session") 
public class UicPlaceController extends PlaceController { 

    @Autowired 
    public UicPlaceController(EventBusHolder eventBus) { 
     super(eventBus.getEventBus()); 
    } 
    ... 
} 

समाधान थोड़ा बदसूरत दिखता है, लेकिन फिर भी, यह समस्या हल करता है।

+0

मुझे लगता है कि धारक के साथ यह काम सुधार किया जा सकता है, लेकिन अभी के लिए यह मुझे काम करता है। – uthark

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