Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @配置&@Bean多个可以被注入_Java_Spring_Spring Boot - Fatal编程技术网

Java @配置&@Bean多个可以被注入

Java @配置&@Bean多个可以被注入,java,spring,spring-boot,Java,Spring,Spring Boot,这是一个springBoot1.5.22项目。我有3个java配置Bean,使用@Configuration和@Bean注释。 当我尝试以调试模式运行项目时。为什么ConfigurationC的myBean方法会执行?ConfigurationA和ConfigurationB的myBean方法不会执行。机制是什么? 就像@jackycflau在上面的评论中说的,你所有的豆子都有相同的名字 这三个bean都具有相同的名称和类型,正在加载,但尚未按顺序初始化到应用程序上下文bean容器中。当从应用

这是一个springBoot1.5.22项目。我有3个java配置Bean,使用@Configuration和@Bean注释。 当我尝试以调试模式运行项目时。为什么ConfigurationC的myBean方法会执行?ConfigurationA和ConfigurationB的myBean方法不会执行。机制是什么?


就像@jackycflau在上面的评论中说的,你所有的豆子都有相同的名字


这三个bean都具有相同的名称和类型,正在加载,但尚未按顺序初始化到应用程序上下文bean容器中。当从应用程序上下文返回一个名为myBean、类型为myBean的bean时,您将从ConfigurationC获得该bean,因为它是最后一个写入容器的bean,容器重写了前两个同名/类型的bean。在客户端代码实际从容器中提取之前,它显然不会被初始化,这就是为什么它是唯一一个真正运行代码的容器。

请提供代码片段以进行更多分析

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();
    }
}

在SpringBoot1.5.x中,默认情况下启用bean重写

这意味着,首先构建bean定义树,然后执行最后一个重写bean,所有其他bean在被重写时都被忽略。在您的案例中,最后一个定义来自ConfigurationC

这种机制防止了雄心勃勃的bean定义,其中找到了多个定义,而Spring无法知道使用哪一个定义-在BeanDefinitionOverrideeException中会发生错误


请注意,这必须在中显式启用。

您可以尝试指定名称:

@Bean(name="bean1")
然后选择注入的bean:

@Autowired
@Qualifier("bean1")

你能展示一下你用来运行这些程序的代码吗?这三个类是如何包含在其他代码中以便运行的?如果不知道这些类的包以及如何引导应用程序,这是不可能回答的。请提供一个最小的和可复制的样本,而不仅仅是代码片段。假设您的三个bean共享相同的名称,这可能会有所帮助……它们都定义了完全相同名称的bean。您收到的日志消息表明myBean的定义正在被替换。所有方法都可以这样执行,我的问题是它们具有相同的方法名称,为什么ConfigurationC的myBean可以执行,为什么ConfigurationA或ConfigurationB不能执行?我想这是因为Spring应用程序上下文bean容器加载所有这三个bean定义。首先加载ConfigurationAmyBean,然后在加载ConfigurationBmyBean时覆盖它。然后,当ConfigurationCmyBean接下来加载时,它将最终被覆盖。因为这是最后一个站着的,所以当从容器中取出myBean时,它会运行。这是一个有根据的猜测,但我认为基本上是正确的。很高兴我能帮上忙。祝你好运!
@Autowired
@Qualifier("bean1")