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");
改变,你可以提供可重复的任何东西的沙漠。
如何解决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");
改变,你可以提供可重复的任何东西的沙漠。