2017-10-13 62 views
0

我想在我的Spring配置XML文件中引用Java配置類,但失敗了,請參閱我下面的代碼:引用JavaConfig在XML配置失敗

Bean1類:

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; 
    } 
} 

Bean2類:

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); 
     } 
    } 
} 

Bean3類別:

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; 
    } 
} 

BeanConfig.xml:

<?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[email protected]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文件是由Spring框架找到的,因爲我們得到的輸出是「This is bean 3」,但是其他2個bean「bean1」和「bean2」不能被找到,即使我把合格BeanConfig類的名稱作爲BeanConfig.xml文件中bean元素的class屬性的值。

我的問題是Spring爲什麼找不到Bean定義,該如何解決?

回答

1

如果您使用xml作爲配置文件來加載上下文,您需要添加<context:component-scan base-package="c2_5_2.ref.javaconfig.from.xml" />這將解決您的問題。因爲你的代碼只是將BeanConfig類創建爲一個bean,但它不知道它是一個配置並觸發掃描包。因爲你只是創建一個bean。

,一旦你在烏爾XML添加右鍵掃描包,它會掃描並獲得BeanConfig文件作爲配置類將創建bean2並掃描包(冗餘包)

通過分量掃描

@Configuration是間使用了@Component註解,因此 @Configuration類是用於組分掃描 (通常使用Spring XML的元素)和 候選因此也可以採取@自動裝配Autowired/@的優點注入等的y 定期@Component。特別是,如果一個構造函數存在 自動裝配語義將被透明地應用於:

<?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> 

更新:如果你想創建bean的配置文件,你可以這樣做:

通過Spring的XML

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

看細節:how spring look for @Configuration

+0

我想我已經加入@Configuration @ComponentScan(basePackages = {「c2_5_2.ref.javaconfig.from.xml」}) 在BeanConfig的那意味着告訴彈簧該類是一個配置類,應該掃描那些頂端類包含在c2_5_2.ref.javaconfig.from.xml包 – user2575502

+0

@ user2575502我已經更新了我的答案,就像我說的你只是創建一個普通的bean,spring並不認爲它是一個配置bean,我已經說過如何使它作爲我更新的答案中的配置bean。 –

+0

非常感謝,看起來書籍春天在行動,第4版(第62頁)錯過了你在這裏說的。 – user2575502