Java 子类型和Spring相互依赖解析与自动关联
我试图理解为什么Springbean相互依赖性解析的工作方式不同于自动连接 假设我们有两个类A和B,其中B扩展了A: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
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中选择自动连接和依赖注入之间有区别。如果你的问题只是有没有办法强制按确切的类型解决依赖关系?那么我们可以转到这个问题,但你目前的假设是错误的。