首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >豆名- Spring在行动中有错误吗?

豆名- Spring在行动中有错误吗?
EN

Stack Overflow用户
提问于 2017-08-08 00:58:48
回答 3查看 424关注 0票数 1

我正在阅读Spring in Action,并通知您,这一段可能是不正确的:

“默认情况下,将给bean一个与@ bean注释的方法的名称相同的ID”,但是为什么“在这种情况下,bean将被命名为 compactDisc”呢?我认为在这种情况下,bean将被命名为sgtPeppers。我是春天的新秀..。

更新:我已经尝试阅读了这本书提供的源代码。这是:

代码语言:javascript
复制
@Configuration
public class CDPlayerConfig {

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

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

}

“我认为这本书有一个错误,就像”奥奇说。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-08 04:01:25

当你读了一本书,发现某件事没有意义时,你首先要做的就是检查一下勘误表。

我相信你正在读第四版的“春运”

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

在Errata:

第44页,第2.3.2节,第三段:在本例中,bean将被命名为compactDisc。在本例中,这个bean将被命名为sgtPeppers。

票数 2
EN

Stack Overflow用户

发布于 2017-08-08 01:22:05

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

为了比较起见,代码的配置完全等同于以下Spring:

代码语言:javascript
复制
<beans>
    <bean name="compactDisc" class="com.acme.compactDisc"/>
</beans>

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

如需进一步探讨,请考虑下列链接:

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

票数 0
EN

Stack Overflow用户

发布于 2017-08-08 02:42:15

看来这部分在书中是正确的:

默认情况下,bean将获得与@Bean注释的方法名称相同的ID。

但这本书在这部分似乎也是不正确的:

在本例中,bean将被命名为compactDisc

我创建了一个快速应用程序,给出了下面的psvm

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
@Configuration
public class MyConfig {

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

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

会为你提供一个例外

线程“主”org.springframework.beans.factory.NoSuchBeanDefinitionException:中的异常没有名为'compactDisc‘的bean可用

但是,如果我将@Bean-annotated方法的名称更改为compactDisc,则异常是不同的。它的内容如下:

线程“主”org.springframework.beans.factory.NoSuchBeanDefinitionException:中的异常没有名为'sgtPeppers‘的bean可用

总之,是的,这本书看上去是有错误的.:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45557716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档