2011-11-14 17 views
6

शुरू नहीं करें मेरे पास एक सेवा है जिसमें सेवा बी पर निर्भरता है। सेवा बी एक वसंत बीन फ़ाइल से आलसी-इनिट = सच i.e के साथ आता है, मैं केवल सेवा बी शुरू करना चाहता हूं जब मैं उस बीन के लिए पूछूं।स्प्रिंग डी - सभी आश्रित बीन्स

हालांकि मैं अपने आवेदन के दौरान सेवा ए का उपयोग करता हूं और जब हम एक सेटटर आधारित इंजेक्शन करते हैं तो सेवा बी प्रारंभ होता है।

मैं सेवा ए को सेवा बी शुरू नहीं करना चाहता, सेवा ए में किसी भी विधि को सेवा बी की आवश्यकता है। ऐसा करने का एक तरीका पहलू का उपयोग कर रहा था, लेकिन मैं सबसे आसान संभव समाधान पर देख रहा था, विशेष रूप से स्प्रिंग xml फ़ाइल में सेवा बी के लिए या सेवा बी या किसी प्रॉक्सी ध्वज में कुछ एनोटेशन।

क्या कोई मदद कर सकता है?

+0

संभव डुप्लिकेट [क्या वसंत में एक वसंत आलसी प्रॉक्सी कारखाना है?] (Http://stackoverflow.com/questions/2391168/is-there-a-spring-lazy-proxy-factory-in-spring) – skaffman

+0

ServiceA में सर्विसबी फैक्ट्री पास करने के बारे में क्या? –

उत्तर

6

मुझे लगता है कि LazyInitTargetSource आपको जो चाहिए वह करता है।

उपयोगी है जब एक प्रॉक्सी संदर्भ आरंभीकरण पर की जरूरत है लेकिन वास्तविक लक्ष्य वस्तु पहला प्रयोग तक आरंभ नहीं किया जाना चाहिए। जब लक्षित बीन को एक एप्लीकेशनकॉन्टेक्स्ट (या एक बीनफ़ैक्ट्री जो उत्सुकता से पूर्व-तत्काल सिंगलटन बीन्स है) में परिभाषित किया जाता है, तो इसे स्टार्टअप पर एप्लिकेशन कॉन्टेक्स्ट (या बीनफैक्टरी) द्वारा तुरंत चालू किया जाएगा।

0

मुझे वसंत के बारे में पता नहीं है, लेकिन गुइस में आप Provider<ServiceB> का उपयोग करेंगे, ताकि जब आप सेवा का उपयोग करने के लिए तैयार हों तो आप provider.get().callMethodOnB(...) पर जाएंगे।

यह मेरा मानना ​​है कि जेएसआर-330 स्पेक का हिस्सा है, इसलिए संभव है कि वसंत में एक समतुल्य चीज़ है (मैंने कुछ समय तक वसंत का एक अद्यतित संस्करण नहीं उपयोग किया है)।

+1

अब देखें! यदि आप डाउनवोट करने जा रहे हैं, तो क्या यह नोट करने के लिए विनम्र नहीं होगा कि क्यों? – dty

0

आप method injection का भी उपयोग कर सकते हैं। एक नियम के रूप में एक संदर्भ से सिंगलटन बीन का एक नया उदाहरण प्राप्त करने की आवश्यकता है, लेकिन इसका उपयोग आपके मामले में भी किया जा सकता है।

नमूना:

package org.test.lazy; 

public abstract class ParentBean { 
    public abstract LazyBean getLazy(); 
    public void lazyDoingSomething() { 
     getLazy().doSomething(); 
    } 
} 

package org.test.lazy; 

public class LazyBean { 
    public void init() { 
     System.out.println("Initialized"); 
    } 
    public void doSomething() { 
     System.out.println("Doing something"); 
    } 
} 

package org.test.lazy; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@ContextConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
public class LazyTest { 

    @Autowired 
    private ParentBean parentBean; 

    @Test 
    public void test() { 
     parentBean.lazyDoingSomething(); 
     parentBean.lazyDoingSomething(); 
    } 
} 

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
"> 
    <import resource="classpath:org/test/lazy/Lazy-context.xml"/> 
    <bean id="parentBean" class="org.test.lazy.ParentBean"> 
     <lookup-method bean="lazyBean" name="getLazy"/> 
    </bean> 
</beans> 

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
" 
default-lazy-init="true"> 

    <bean id="lazyBean" class="org.test.lazy.LazyBean" init-method="init" /> 
</beans> 

तो आप आलसी बीन मांग पर केवल एक बार शुरू किया जाएगा।

1

एक और दृष्टिकोण है कि आप का प्रयास करने के http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/aop/framework/autoproxy/target/LazyInitTargetSourceCreator.html पर चर्चा की है चाहते हो सकता है:

TargetSourceCreator कि प्रत्येक सेम कि के रूप में "आलसी-init" परिभाषित किया गया है के लिए एक LazyInitTargetSource लागू करता है [LazyInitTargetSourceCreator एक है]। इससे उन बीन्स में से प्रत्येक के लिए बनाई गई प्रॉक्सी का कारण बन जाएगा, जो कि वास्तव में लक्ष्य बीन इंस्टेंस को प्रारंभ किए बिना ऐसे बीन का संदर्भ प्राप्त करने की अनुमति देता है।

विशिष्ट सेम या आलसी-init केवल प्रॉक्सी के निर्माण के लिए के लिए कस्टम इंटरसेप्टर के साथ संयोजन में एक स्वत: प्रॉक्सी निर्माता के लिए कस्टम TargetSourceCreator रूप में पंजीकृत होना करने के लिए,। उदाहरण के लिए, के रूप में एक XML आवेदन संदर्भ परिभाषा स्वतः डिटेक्ट बुनियादी ढांचे सेम:

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="customTargetSourceCreators"> 
    <list> 
     <bean class="org.springframework.aop.framework.autoproxy.target.LazyInitTargetSourceCreator"/> 
    </list> 
    </property> 
</bean> 

<bean id="myLazyInitBean" class="mypackage.MyBeanClass" lazy-init="true"> 
    ... 
</bean> 

आप अपने आप को मिल जाए एक आवेदन के संदर्भ में कई बार कर रही है, इस विन्यास पर बचत होगी।

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