2017-08-08 80 views
1

我讀的行動我和春天通知,也許這一段是不正確的:Bean名爲 - Spring in Action有錯誤嗎?

enter image description here

默認情況下,這個bean將獲得一個ID是一樣的@ Bean-註解方法的名稱「但爲什麼」在這種情況下,這個bean將被命名爲compactDisc「?我認爲在這種情況下,bean將被命名爲sgtPeppers。 我在春天是一個新鮮的...

更新: 我曾嘗試閱讀,這本書提供的源代碼。這就是:

@Configuration 
public class CDPlayerConfig { 

    @Bean 
    public CompactDisc compactDisc() { 
    return new SgtPeppers(); 
    } 

    @Bean 
    public CDPlayer cdPlayer(CompactDisc compactDisc) { 
    return new CDPlayer(compactDisc); 
    } 

} 

我認爲這本書有一個錯字像@ochi說。

+1

指https://docs.spring.io /spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html –

+1

這看起來好像是書中的一個錯字,你試過了嗎?如果我有時間,我會自己試試 – ochi

+1

@ochi,你是對的!我看了一下本書的源代碼。 – KhoaTran

回答

3

當你讀了一本書,發現一些沒有意義的東西,你應該做的第一件事就是檢查勘誤表。

我相信你正在閱讀的第4版 「春天行動」

https://www.manning.com/books/spring-in-action-fourth-edition

在勘誤表:

Page 44, Section 2.3.2, third paragraph: 

In this case, the bean will be named compactDisc. 

should be 

In this case, the bean will be named sgtPeppers. 
1

當JavaConfig遇到這樣的方法時,它將執行該方法並將返回值作爲Bean註冊到BeanFactory中。 @Bean是一個方法級別的註釋,並且是XML元素的直接模擬。

爲了比較起見,代碼的結構是完全等同於以下彈簧XML:

<beans> 
    <bean name="compactDisc" class="com.acme.compactDisc"/> 
</beans> 

該屬性指定唯一的豆標識符。在基於XML的配置元數據中,使用id和/或name屬性來唯一指定bean標識符(可以通過名稱或ID)。

作進一步的探索,笑納給出的鏈接:

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-scanning-name-generator

+0

我認爲你的bean行是錯誤的:該方法返回類'CompactDisc'的對象,而不是類'sgtPeppers'的對象。 –

+0

@ThomasKläger是的,它將返回對象。 – Tehmina

0

嗯,看起來這部分是本書正確:

默認情況下,bean將被給予與@ Bean註釋的方法名稱相同的ID

但它看起來也像書本是inc orrect在這一部分:

在這種情況下,bean將被命名爲compactDisc

我創建了一個快速的應用程序,其中,給予以下psvm

public class MyApp { 
    public static void main(String[] args) { 

     ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class); 

     // 1) This bean name will not be found, the method name is sgtPeppers 
     CompactDisc compactDisc = ctx.getBean("compactDisc", CompactDisc.class); 
     System.out.println("app 1: " + compactDisc.toString()); 

     // 2) this bean will be found 
     SgtPeppers sgtPeppers = ctx.getBean("sgtPeppers", SgtPeppers.class); 
     System.out.println("app 2: " + sgtPeppers.toString()); 

     CdPlayer cdPlayer = ctx.getBean("cdPlayer", CdPlayer.class); 
     System.out.println("app 3: " + cdPlayer.toString()); 
    } 
} 

而且MyConfig.java看起來像這樣:

@Configuration 
public class MyConfig { 

    @Bean 
    public CompactDisc sgtPeppers() { 
     return new SgtPeppers(); 
    } 

    @Bean 
    public CdPlayer cdPlayer(CompactDisc compactDisc) { 
     return new CdPlayer(compactDisc); 
    } 
} 

將爲您提供例外

線程「main」org.springframework.beans.factory中的異常。NoSuchBeanDefinitionException:無豆命名爲「compactDisc」可用

但是,如果我改變compactDisc@Bean-annotated方法名的例外是不同的。它讀取:

異常線程 「main」 org.springframework.beans.factory.NoSuchBeanDefinitionException:無豆命名爲 'sgtPeppers' 可用

簡而言之,是的,它看起來像書有一個錯誤... :)

相關問題