@Configuration和@Bean可以注入的倍数

时间:2019-12-18 07:12:25

标签: java spring spring-boot

这是一个springBoot1.5.22项目。我有3个Java config Bean,使用@Configuration@Bean批注。 当我尝试以调试模式运行项目时。为何执行myBean的{​​{1}}方法??,ConfigurationCmyBean的{​​{1}}方法不执行。什么是机制? packages of the classes start class

ConfigurationA

4 个答案:

答案 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")