Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 子类型和Spring相互依赖解析与自动关联_Java_Spring_Spring Boot - Fatal编程技术网

Java 子类型和Spring相互依赖解析与自动关联

Java 子类型和Spring相互依赖解析与自动关联,java,spring,spring-boot,Java,Spring,Spring Boot,我试图理解为什么Springbean相互依赖性解析的工作方式不同于自动连接 假设我们有两个类A和B,其中B扩展了A: public class A {} public class B {} extends A {} 以下Java配置: @Configuration public class TestConfiguration { @Bean public A a() { return new A(); } @Bean public

我试图理解为什么Springbean相互依赖性解析的工作方式不同于自动连接

假设我们有两个类A和B,其中B扩展了A:

public class A {}

public class B {} extends A {}
以下Java配置:

@Configuration
public class TestConfiguration {

    @Bean
    public A a() {
        return new A();
    }

    @Bean
    public B b() {
        return new B();
    }

    @Bean
    public A testBean(A bean) {
        return bean;
    }

}
产生以下错误:

Description:

Parameter 0 of method testBean in com.so.demo.TestConfiguration required a single bean, but 2 were found:
    - a: defined by method 'a' in class path resource [com/so/demo/TestConfiguration.class]
    - b: defined by method 'b' in class path resource [com/so/demo/TestConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
错误的假设(见以下引用):

但是如果我从配置中删除testBean,并尝试自动连接类型A的bean:

@SpringBootApplication
public class DemoApplication implements ApplicationRunner {

    @Autowired
    A a; 

    @Override
    public void run(ApplicationArguments arg0) throws Exception {
        System.out.println(a.getClass().getName());
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
自动连线字段将是正确的类型A。同样,如果我从配置中删除一个bean,只留下B bean,那么B bean将自动连线到字段DemoApplication#A。这是我在这种情况下所期望的行为


现在我的问题是,为什么即使有两个可能的候选者(一个是子类),自动连线也能正确地推断类型(使用确切的类型而不是子类)?但在配置中注入依赖项会导致上述错误

感谢@Sotirios Delimanolis澄清本部分:

所以我的假设是错误的。自动布线之所以起作用,是因为它故障切换回“按名称自动布线”。如果我在DemoApplication中更改字段名使其与bean名不匹配,它将以与配置类相同的方式失败

有没有办法强制按确切类型解析依赖关系


我创建这个简单的示例只是为了帮助澄清我的想法 问题是。实际上,我有两个基于Spring的不同库 启动时,一个依赖于超类型,另一个依赖于子类型,我 由于第一个库的自动配置而发生冲突 失败,因为它无法决定要注入的bean同时具有这两个属性 bean池中的超类型和子类型

[FYI]我不想看到名为bean的解决方案


提前谢谢

字段的名称更改为其他名称。那就失败了。这又回到了bean名称解析上来。谢谢,但这正是我所说的,我不想按名称解析,也许问题的最后一部分有点混乱。所以你知道现在我的问题的答案是,为什么即使有两个可能的候选者,自动连线也能正确地推断类型(使用确切的类型而不是子类)(一个为子类)?编辑掉。这就是我的问题,如果有人能解释为什么在配置bean中选择自动连接和依赖注入之间有区别。如果你的问题只是有没有办法强制按确切的类型解决依赖关系?那么我们可以转到这个问题,但你目前的假设是错误的。