这是一个springBoot1.5.22项目。我有3个Java config Bean,使用@Configuration
和@Bean
批注。
当我尝试以调试模式运行项目时。为何执行myBean
的{{1}}方法??,ConfigurationC
和myBean
的{{1}}方法不执行。什么是机制?
packages of the classes
start class
ConfigurationA
答案 0 :(得分:1)
就像@jackycflau在上面的评论中说的那样,您所有的bean都具有相同的名称。
这三个具有相同名称和类型的bean将依次装入(但尚未初始化)到应用程序上下文(bean容器)中。当从应用程序上下文返回类型为.. toctree::
:maxdepth: 2
intro
strings
datatypes
numeric
(many more documents listed here)
的名为“ myBean”的bean时,您会从MyBean
获得一个,因为它是写入容器的最后一个,覆盖了该容器的前两个bean。相同的名称/类型。直到客户端代码将其从容器中实际拉出之后,它才被初始化,这就是为什么它是唯一实际运行代码的原因。
答案 1 :(得分:0)
请提供代码段以进行更多分析。
Bean ID应该是唯一的。我认为您不会被允许使用相同的beanid创建bean。
请尝试下面的代码
@Configuration
public class ConfigurationA {
@Bean
public MyBean myBean(){
System.out.println("ConfigurationA myBean init");
return new MyBean();
}
}
@Configuration
public class ConfigurationB {
@Bean
public MyBean myBean1(){
System.out.println("ConfigurationB myBean init");
return new MyBean();
}
}
@Configuration
public class ConfigurationC {
@Bean
public MyBean myBean2(){
System.out.println("ConfigurationC myBean init");
return new MyBean();
}
}
答案 2 :(得分:0)
在Spring Boot 1.5.x中,默认情况下启用Bean覆盖。
这意味着,首先构建Bean定义树,然后使用(执行)最后一个覆盖的Bean,所有其他的Bean被忽略(因为它们被覆盖)。您的情况下,最后一个定义来自ConfigurationC
。
这种机制可以防止在雄心勃勃的bean定义中找到多个定义,而Spring无法知道要使用哪个定义-发生错误(BeanDefinitionOverrideException
)。
请注意,必须在Spring Boot 2.x中明确启用此功能。
答案 3 :(得分:0)
您可以尝试指定名称:
@Bean(name="bean1")
,然后选择注入的bean:
@Autowired
@Qualifier("bean1")