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

“默认情况下,将给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);
}
}“我认为这本书有一个错误,就像”奥奇说。
发布于 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。
发布于 2017-08-08 01:22:05
当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为BeanFactory中的bean。@Bean是一个方法级注释,是XML元素的直接模拟。
为了比较起见,代码的配置完全等同于以下Spring:
<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
发布于 2017-08-08 02:42:15
看来这部分在书中是正确的:
默认情况下,bean将获得与@Bean注释的方法名称相同的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);
}
}会为你提供一个例外
线程“主”org.springframework.beans.factory.NoSuchBeanDefinitionException:中的异常没有名为'compactDisc‘的bean可用
但是,如果我将@Bean-annotated方法的名称更改为compactDisc,则异常是不同的。它的内容如下:
线程“主”org.springframework.beans.factory.NoSuchBeanDefinitionException:中的异常没有名为'sgtPeppers‘的bean可用
总之,是的,这本书看上去是有错误的.:)
https://stackoverflow.com/questions/45557716
复制相似问题