Bean命名 - Spring in Action有错吗?

时间:2017-08-08 00:58:49

标签: java spring spring-mvc

我正在阅读Spring in Action,我通知说这段可能不正确:

enter image description here

" 默认情况下,bean将被赋予一个与@ Bean注释方法的名称相同的ID "但为什么" 在这种情况下,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这样的拼写错误。

3 个答案:

答案 0 :(得分:2)

当你读一本书并发现某些事情没有意义时,你应该做的第一件事就是检查勘误。

我相信你正在阅读第4版" Spring in Action"

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 :(得分:0)

当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为BeanFactory中的bean。 @Bean是方法级注释,是XML元素的直接模拟。

为了比较,代码的配置与以下Spring XML完全相同:

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

此属性唯一地指定bean标识符。在基于XML的配置元数据中,您使用id和/或name属性唯一地指定bean标识符(通过名称或ID )。

如需进一步探索,请考虑给定的链接:

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

答案 2 :(得分:0)

好吧,看起来这部分在本书中是正确的:

  

默认情况下,bean将被赋予一个与@ Bean-annotated方法名称相同的ID

但这部分看起来也不正确:

  

在这种情况下,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);
    }
}

将为您提供例外

  

线程中的异常&#34; main&#34; org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为&#39; compactDisc &#39;可用

但是,如果我将@Bean-annotated方法的名称更改为compactDisc,则例外情况会有所不同。它写着:

  

线程中的异常&#34; main&#34; org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为&#39; sgtPeppers &#39;可用

简而言之,是的确看起来这本书有错......:)