2013-10-11 8 views
11

यदि मैं एक ही कक्षा के दो सेम परिभाषित कर रहा हूं और कोई गुंजाइश नहीं दे रहा हूं। फिर वर्ग के कितने उदाहरण बनाए जाएंगे। उदाहरण के लिएएक ही कक्षा के दो बीन्स को एक ही अनुप्रयोग संदर्भ में परिभाषित करें

applicationContext.xml में

<bean name="testBean" class="com.test.Example"/> 
<bean name="myBean" class="com.test.Example"/> 

उत्तर

7

स्प्रिंग प्रकार com.test.Example के दो सेम पैदा करेगा और autowiring प्रकार या विधि नाम (या क्वालिफायर) के लिए किया जाएगा, देख Spring IOC

इस देखें साधारण परीक्षण:

इस वर्ग

public static class TestBean { 
    static int INT = 1; 
    public int test; 
    public TestBean() { 
     test = INT++; 
    } 


} 
के साथ

विन्यास xml:

<bean name="testBean" class="com.test.TestBean"/> 
<bean name="myBean" class="com.test.TestBean"/> 

वसंत कंटेनर परीक्षण के साथ JUnit4:

@Resource 
TestBean testBean; 

@Resource 
TestBean myBean; 

@Test 
public void test() { 

    assertNotNull(testBean); 
    assertNotNull(myBean); 
    assertFalse(testBean == myBean); 
    assertFalse(testBean.test == myBean.test); 
} 

इस परीक्षा न असफल, जैसा कि आप देख, प्रकार TestBean के दो सेम बनाया जाता है।

स्प्रिंग डॉक्टर में इस हिस्से देखें:

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

byType
संपत्ति को वास्तव में कंटेनर में मौजूद संपत्ति प्रकार का एक बीन मौजूद होने की अनुमति देता है। यदि एक से अधिक मौजूद हैं, तो घातक अपवाद फेंक दिया जाता है, जो इंगित करता है कि आप उस बीन के लिए टाइप ऑटोवॉयरिंग द्वारा उपयोग नहीं कर सकते हैं। यदि कोई मिलान करने वाले सेम नहीं हैं, तो कुछ भी नहीं होता है; संपत्ति सेट नहीं है।

कन्स्ट्रक्टर
टाइप टाइप के लिए एनालॉग, लेकिन कन्स्ट्रक्टर तर्कों पर लागू होता है। यदि कंटेनर में कन्स्ट्रक्टर तर्क प्रकार का बिल्कुल एक बीन नहीं है, तो एक घातक त्रुटि उठाई जाती है।

+0

एक सिंगलटन वस्तु। यदि हम कक्षा के एन सिंगलटन ऑब्जेक्ट की तुलना में बीन एन बार परिभाषित करेंगे। –

+0

धन्यवाद @ आर्टूरो, मुझे एक ही संदेह था। अब स्पष्टता मिली है। –

0

वसंत इस परिदृश्य में दो उदाहरण बनाएगा। वसंत कंटेनर प्रति बीन परिभाषा एक सिंगलटन उदाहरण बनाता है।

जब आप getContext.getBean फोन ("testBean") हमेशा आप एक ही उदाहरण testBean सेम परिभाषा के लिए दे देंगे

जब आप getContext.getBean फोन ("myBean") हमेशा आप एक ही उदाहरण myBean सेम परिभाषा के लिए दे देंगे ।

0

हां। वसंत इस परिदृश्य में दो उदाहरण पैदा करेगा। वसंत कंटेनर प्रति बीन परिभाषा एक सिंगलटन उदाहरण बनाता है। पूर्व: वसंत कंटेनर में परिभाषा के अनुसार

public class Test { 

    @SuppressWarnings("resource") 
    public static void main(String[] args) { 

     ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml"); 
     TestBean teatBean = (TestBean) ac.getBean(TestBean.class); 
     TestBean myBean1 = (TestBean) ac.getBean(TestBean.class); 
     System.out.println("a : " + teatBean.test + " : " 
       + teatBean.getName()); 
     teatBean.setName("a TEST BEAN 1"); 
     System.out.println("uPdate : " + teatBean.test + " : " 
       + teatBean.getName()); 

     System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName()); 
     myBean1.setName(" a1 TEST BEAN 10"); 
     System.out.println("a1 update : " + teatBean.test + " : " 
       + myBean1.getName()); 

    } 

} 


<bean class="com.spring4hibernate4.TestBean"> 
     <constructor-arg name="i" value="1"></constructor-arg> 
     <property name="name" value="1-name"></property> 
    </bean> 

    <bean class="com.spring4hibernate4.TestBean"> 
     <constructor-arg name="i" value="10"></constructor-arg> 
     <property name="name" value="10-name"></property> 
    </bean> 
</beans> 


public class Test { 

    @SuppressWarnings("resource") 
    public static void main(String[] args) { 

     ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml"); 
     TestBean teatBean = (TestBean) ac.getBean(TestBean.class); 
     TestBean myBean1 = (TestBean) ac.getBean(TestBean.class); 
     System.out.println("a : " + teatBean.test + " : " 
       + teatBean.getName()); 
     teatBean.setName("a TEST BEAN 1"); 
     System.out.println("uPdate : " + teatBean.test + " : " 
       + teatBean.getName()); 

     System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName()); 
     myBean1.setName(" a1 TEST BEAN 10"); 
     System.out.println("a1 update : " + teatBean.test + " : " 
       + myBean1.getName()); 

    } 

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