org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException

org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException

如何解决Spring中Bean的AUTOMATIC CONNECTION中的歧义? 我们有一个 Dessert 接口,我们有三个不同的甜点(Beans)实现了这个接口(Dessert)。

今天的甜点是饼干,所以我们把它写成了@Primary的最爱。

问题是甜点是刚做的,如果有人想重复甜点,就没有饼干了,所以我们为那些想重复甜点的人创造了"repeatDessert"。

除了最喜欢的甜品,还有两个甜品,CAKE AND ICECREAM。 我们希望每个重复的人都能得到冰淇淋甜点,我们有足够的。

我们如何判断Spring我们想让它提供两种甜点中的哪一种?

public interface Dessert {
    void eat();
}

豆饼:

@Component
public class Cake implements Dessert{

    private Dessert repeatDessert;

    public Dessert getRepeatDessert() {
        return repeatDessert;
    }

    @Autowired
    public void setRepeatDessert(Dessert repeatDessert) {
       this.repeatDessert = repeatDessert;
    }

    @Override
    public void eat() {
        System.out.println("Eating a Cake !!!!");
    }
}

豆饼:

@Component
@Primary
public class Cookie implements Dessert{

    private Dessert repeatDessert;

    public Dessert getRepeatDessert() {
        return repeatDessert;
    }

    @Autowired
    public void setRepeatDessert(Dessert repeatDessert) {
       this.repeatDessert = repeatDessert;
    }

    @Override
    public void eat() {
        System.out.println("Eating a Cookie !!!!");
    }
}

豆冰淇淋:

@Component
public class IceCream implements Dessert{

    private Dessert repeatDessert;

    public Dessert getRepeatDessert() {
        return repeatDessert;
    }

    @Autowired
    public void setRepeatDessert(Dessert repeatDessert) {
       this.repeatDessert = repeatDessert;
    }

    @Override
    public void eat() {
        System.out.println("Eating a IceCream !!!!");
    }
}

这将是配置文件:

@Configuration
@ComponentScan
public class AutoBeanConfiguration {

}

这将是主要的 class:

public class Main {

    public static void main(String[] args) {
        BasicConfigurator.configure();
        Logger.getRootLogger().setLevel(Level.ERROR);
        AnnotationConfigApplicationContext ctxt = new AnnotationConfigApplicationContext(AutoBeanConfiguration.class);
        Cookies cookies = ctxt.getBean(Cookies.class);
        cookies.eat();
        Dessert dessert = cookies.getRepeatDessert();
        dessert.eat();
        ctxt.close();
    }

}

程序抛出以下内容exception

Exception in thread "main" Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cookies': Unsatisfied dependency expressed through method 'setRepeatDessert' parameter 0;
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'Dessert' available: expected single matching bean but found 2: cake,iceCream

我们如何解决歧义并告诉 spring 我们想要创建哪些甜点,何时重复?

控制台输出应该是这样的:

Eating a Cookies !!!!
Eating a IceCream !!!!

首先,您的代码存在编译错误。请更改此代码

Cookies cookies = ctxt.getBean(Cookies.class);

Cookie cookie = ctxt.getBean(Cookie.class);

然后在您的 bean class 中,所有 setter 方法都与 repeatDessert 同名。所以这会找到任何与此名称相同的 repeatDessert bean。所以这找不到任何带有 this.In 你的 bean setter 方法 class 的 bean;

@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
   this.repeatDessert = repeatDessert;
}

方法参数repeatDessert没有指定到哪个bean。如果你用 Qualifier 像这样更改所有 bean class。 Read more detail about Qualifier;

对于Cake.class

@Autowired
@Qualifier("cake")
public void setRepeatDessert(Dessert repeatDessert) {
    this.repeatDessert = repeatDessert;
}

对于IceCream.class

@Autowired
@Qualifier("iceCream")
public void setRepeatDessert(Dessert repeatDessert) {
    this.repeatDessert = repeatDessert;
}

对于Cake.class

@Autowired
@Qualifier("cake")
public void setRepeatDessert(Dessert repeatDessert) {
    this.repeatDessert = repeatDessert;
}

现在您的 spring 项目可以运行了。但我认为你的结果无法产生。因为您的主体中没有任何关于冰淇淋的信息,所以只有 Cookie 但您想打印 Eating a IceCream !!!! 。我不明白你的输出。如果这不能解决您的问题,您可以提供吗?

PS:如果你想改变你的class的repeatDessert,你可以用@Qualifier("yourBeanName");改变,你可以提供可重复的任何东西的沙漠。