मैं अपनी स्प्रिंग कॉन्फिग एक्सएमएल फाइल में जावा कॉन्फिग क्लास का संदर्भ देना चाहता हूं, लेकिन असफल रहा, कृपया मेरे कोड के नीचे देखें:

बीन 1 वर्ग:

package c2_5_2.ref.javaconfig.from.xml;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("bean1")
public class Bean1 {
    @Autowired
    public Bean1(Bean2 bean2)
    {
        this.bean2 = bean2;
    }
    private Bean2 bean2;

    public Bean2 getBean2() {
        return bean2;
    }
}

बीन 2 वर्ग:

package c2_5_2.ref.javaconfig.from.xml;

import java.util.List;

public class Bean2 {
    private List<String> nameList;

    public List<String> getNameList() {
        return nameList;
    }

    public void setNameList(List<String> nameList) {
        this.nameList = nameList;
    }

    public void displayNames()
    {
        for(String name : nameList)
        {
            System.out.println(name);
        }
    }
}

बीन3 क्लास:

package c2_5_2.ref.javaconfig.from.xml;

public class Bean3 {
    private Bean1 b1;

    public Bean1 getB1() {
        return b1;
    }

    public void setB1(Bean1 b1) {
        this.b1 = b1;
    }

    public void introduce()
    {
        System.out.println("this is bean 3");
    }

}

जावा कॉन्फ़िग क्लास:

package c2_5_2.ref.javaconfig.from.xml;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages= {"c2_5_2.ref.javaconfig.from.xml"})
public class BeanConfig {

    @Bean(name="bean2")
    public Bean2 getBean2()
    {
        Bean2 b2 = new Bean2();
        List<String> nameList = new ArrayList<String>();
        nameList.add("Bitt");
        nameList.add("Rock");
        nameList.add("Lucas");
        nameList.add("Crius");
        b2.setNameList(nameList);
        return b2;
    }
}

बीनकॉन्फिग.एक्सएमएल:

<?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.xsd">
      <bean class="c2_5_2.ref.javaconfig.from.xml.BeanConfig"></bean>
      <bean id="bean3" class="c2_5_2.ref.javaconfig.from.xml.Bean3"></bean>


</beans>

परीक्षण विधि चलाएँ:

private static void test3()
{
    ApplicationContext ctx = new ClassPathXmlApplicationContext("c2_5_2/ref/javaconfig/from/xml/BeanConfig.xml");
    Bean3 b3 = ctx.getBean(Bean3.class);
    b3.introduce();
    Bean1 b1 = ctx.getBean(Bean1.class);
}    

निम्न आउटपुट और त्रुटि संदेश प्राप्त करें:

Oct 13, 2017 9:55:16 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6d9c638: startup date [Fri Oct 13 09:55:16 CST 2017]; root of context hierarchy
Oct 13, 2017 9:55:16 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [c2_5_2/ref/javaconfig/from/xml/BeanConfig.xml]
**this is bean 3**
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'c2_5_2.ref.javaconfig.from.xml.Bean1' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:348)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:335)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1101)
    at c2_5_2.ref.javaconfig.from.xml.Test_Driven.test3(Test_Driven.java:33)
    at c2_5_2.ref.javaconfig.from.xml.Test_Driven.main(Test_Driven.java:12)

तो आउटपुट से हम देख सकते हैं कि स्प्रिंग कॉन्फ़िगरेशन xml फ़ाइल स्प्रिंग फ्रेमवर्क द्वारा पाई जाती है क्योंकि हमें आउटपुट "यह बीन 3 है", लेकिन अन्य 2 बीन्स, "बीन 1" और "बीन 2" नहीं मिल सकते हैं, भले ही मैंने योग्य नाम रखा हो BeanConfig.xml फ़ाइल में बीन तत्व के वर्ग गुण के मान के रूप में BeanConfig वर्ग का।

मेरी चिंता यह है कि वसंत को बीन परिभाषा क्यों नहीं मिल रही है, इसे कैसे ठीक किया जाए?

0
user2575502 13 अक्टूबर 2017, 05:05

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप संदर्भ को लोड करने के लिए कॉन्फ़िगरेशन फ़ाइल के रूप में xml का उपयोग करते हैं तो आपको <context:component-scan base-package="c2_5_2.ref.javaconfig.from.xml" /> जोड़ने की आवश्यकता है जो आपकी समस्या को ठीक कर देगा। चूंकि आप कोड केवल बीनकॉन्फिग क्लास को बीन के रूप में बनाते हैं लेकिन यह नहीं जानता कि यह एक कॉन्फ़िगरेशन है और पैकेज को स्कैन करें। क्योंकि आप सिर्फ एक बीन बनाते हैं।

एक बार जब आप अपने एक्सएमएल में संदर्भ-स्कैन-पैकेज जोड़ते हैं, तो यह स्कैन करेगा और बीनकॉन्फिग फ़ाइल को कॉन्फ़िगरेशन क्लास के रूप में प्राप्त करेगा जो बीन 2 बनाएगा और पैकेज स्कैन करेगा (अनावश्यक पैकेज)

घटक स्कैनिंग के माध्यम से

@कॉन्फ़िगरेशन @कंपोनेंट के साथ मेटा-एनोटेट है, इसलिए @कॉन्फ़िगरेशन क्लास कंपोनेंट स्कैनिंग के लिए उम्मीदवार हैं (आमतौर पर स्प्रिंग एक्सएमएल के तत्व का उपयोग करते हुए) और इसलिए किसी भी नियमित @कंपोनेंट की तरह @Autowired/@Inject का लाभ भी उठा सकते हैं। विशेष रूप से, यदि कोई एकल कंस्ट्रक्टर मौजूद है तो ऑटोवॉयरिंग शब्दार्थ को पारदर्शी रूप से लागू किया जाएगा:

<?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.xsd">
      <bean class="c2_5_2.ref.javaconfig.from.xml.BeanConfig"></bean>
      <bean id="bean3" class="c2_5_2.ref.javaconfig.from.xml.Bean3"></bean>

      <context:component-scan base-package="c2_5_2.ref.javaconfig.from.xml" />

</beans>

अपडेट करें: यदि आप बीन को कॉन्फ़िगरेशन फ़ाइल के रूप में बनाना चाहते हैं तो आप यह कर सकते हैं:

स्प्रिंग एक्सएमएल के माध्यम से

<beans>
    <context:annotation-config/>
    <bean class="c2_5_2.ref.javaconfig.from.xml.BeanConfig"/>
 </beans>

विवरण देखें : वसंत कैसा दिखता है @कॉन्फ़िगरेशन. के लिए

1
Chi Dov 13 अक्टूबर 2017, 08:11
मुझे लगता है कि मैंने BeanConfig के शीर्ष पर @Configuration @ComponentScan(basePackages= {"c2_5_2.ref.javaconfig.from.xml"}) जोड़ा है, जिसका अर्थ है कि स्प्रिंग को बताना कि यह क्लास एक कॉन्फ़िगरेशन क्लास है और c2_5_2 में शामिल उन क्लास को स्कैन करना चाहिए। ref.javaconfig.from.xml पैकेज
 – 
user2575502
13 अक्टूबर 2017, 08:03
मैंने अपना उत्तर अपडेट कर दिया है, जैसे मैं कहता हूं कि आप केवल एक सामान्य बीन बनाते हैं, वसंत इसे कॉन्फ़िगरेशन बीन के रूप में नहीं पहचानता है, मैंने कहा है कि इसे मेरे अद्यतन उत्तर में कॉन्फ़िगरेशन बीन के रूप में कैसे बनाया जाए।
 – 
Chi Dov
13 अक्टूबर 2017, 08:18
बहुत-बहुत धन्यवाद, ऐसा लगता है कि बुक स्प्रिंग इन एक्शन, चौथा संस्करण (पृष्ठ 62) आपके द्वारा यहां कही गई बातों से चूक गया।
 – 
user2575502
13 अक्टूबर 2017, 08:37
आपका स्वागत है, कृपया मेरे उत्तर को स्वीकार करें और वोट करें ताकि इसे अधिक लोगों तक साझा किया जा सके यदि आपको लगता है कि यह आपकी मदद करता है
 – 
Chi Dov
13 अक्टूबर 2017, 08:38