gpt4 book ai didi

java - 报告了 Spring 误报循环依赖

转载 作者:行者123 更新时间:2023-11-30 11:06:10 25 4
gpt4 key购买 nike

当依赖顺序如下所示时,Spring 报告误报循环依赖错误

  • FactoryBean 依赖于 List(例如 AnimalFeeder)
  • AnimalFeeder 依赖于字符串列表。

有趣的事情是

  1. 当 spring 实例化顺序更改时未观察到问题 Ie) FactoryBean 在 AnimalFeeder 之前。但是,当 AnimalFeeder 在 FactoryBean 之前出现时,就会出现问题。
  2. 只有在涉及 FactoryBean 时才会发生这种情况。当使用简单的 bean 类而不是 FactoryBean 时,没有观察到问题。

这里是源码

public interface Feeder {
void feed();
}

public class AnimalFeederImpl implements Feeder {
private List<String> feedingTypes;
public AnimalFeederImpl(List<String> feedingTypes) {
this.feedingTypes = feedingTypes;
}
@Override
public void feed() {
//feed here
}
}

public class FeederManager {
private final List<Feeder> feeders;
public FeederManager(List<Feeder> feeders) {
this.feeders = feeders;
}

//This method will trigger the feeding for every 4 hours
public void triggerFeeding() {
}
}


public class FeederFactory implements FactoryBean, InitializingBean {
private List<Feeder> feeders;
private FeederManager feederManager;
public FeederFactory(List<Feeder> feeders) {
this.feeders = feeders;
}

@Override
public void afterPropertiesSet() throws Exception {
feederManager = new FeederManager(feeders);
}

public static void main(String args[]){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
context.setAllowBeanDefinitionOverriding(false);
context.setConfigLocation("test-application-context.xml");
context.refresh();
}
}

这是上下文文件

 <bean id="water" class="java.lang.String">
<constructor-arg value="water"/>
</bean>
<bean id="animalFeeder" class="org.test.spring.autowire.impl.AnimalFeederImpl" autowire="constructor"/>
<bean id="animalFeeder" class="org.test.spring.autowire.impl.AnimalFeederImpl" autowire="constructor"/>
<bean id="feederMgr" class="org.test.spring.autowire.impl.FeederFactory" autowire="constructor"/>

谢谢!

最佳答案

问题(在您看似不完整的示例中也会导致编译错误)是您的 FeederFactory实现类型 FactoryBean .

public class FeederFactory implements FactoryBean, InitializingBean {

当 Spring 尝试实例化 AnimalFeederImpl 时bean 使用它的构造函数

public AnimalFeederImpl(List<String> feedingTypes) {
this.feedingTypes = feedingTypes;
}

它需要先构造List<String>争论。为此,它需要扫描 String 类型的 bean 的上下文。 .它肯定知道 waterString 类型的 bean因为它是在 XML 配置中以这种方式声明的。它肯定知道 AnimalFeederImpl不是 String 类型的 bean因为它的类类型也被声明了。

对于 FeederFactory , 但是,它有点不同。通过将该类声明为 FactoryBean 的子类,您告诉 Spring 这个 bean 可以创建另一种类型的 bean。为了找出是什么类型,Spring 需要实例化 FeederFactory。输入并使用它的 getObjectType方法。

但是它的实例化需要Spring Autowiring

public FeederFactory(List<Feeder> feeders) {

这需要它实例化 AnimalFeederImpl它已经在 build 中,整个事情因循环依赖而失败。

关于java - 报告了 Spring 误报循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29394469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com