@Configuration
public Class ConfigClass{
@Bean
public Apple apple(){stuff to return apple bean}
@Bean
public Orange orange(){stuff to return orange bean}
}
@Component
public Class FruitEater<ReturnType extends Fruit>{
@Bean
ReturnType fruit;
}
我得到了这个漂亮的歧义错误信息:
没有定义[水果]类型的合格豆:预期的单一匹配豆,但发现2:苹果注射,橘子注射autowired依赖性失败;嵌套异常是org.springframework.beans.factory.beanCreationException:不能autowire字段:fruiteater.bean;嵌套异常是org.springframework.beans.factory.nouniqueBeanDefinitionException:未定义[fruite]类型的合格bean:预期为单个匹配bean,但找到2:apple,orange
我的想法是,由于ReturnType应该在编译时解析,所以spring应该能够基于泛型类型进行Autowire。我听说过Spring的ResolvableType,但我不确定如何利用它,因为我对Spring还是相当陌生的。有没有办法解决这个问题,让我的水果食客成为一个普通的水果食客?
谢谢,提前。
您已经声明了一个singleton(默认)fruiteater
bean。单例bean被急切地初始化(YMMV)。
在您的示例中,Spring看到了Fruiteater
类型的bean定义,但仅此而已。没有参数化(returntype
)的参数,也没有提示应该向fruit
注入什么。它无法在Apple
和Orange
这两种豆子之间进行选择。
假设您已经声明fruiteater
,而不是使用一个prototype作用域(或类似的东西),并且具有如下注入目标
@Autowired
private FruitEater<Apple> fruitEater;
要注入的bean将在注入时创建,并且将有足够的类型信息来创建它并注入它的字段。本例中的Apple
bean。
目前不支持此操作。
一个解决方案是删除fruiteater
bean声明(@component)
,而是提供适当的参数化子类型
@Component
class OrangeEater extends FruitEater<Orange> {
}
class FruitEater<ReturnType extends Fruit> {
@Autowired
protected ReturnType fruit;
}
完整示例
public class Sample {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
System.out.println(ctx.getBean(Injected.class).orangerEater);
System.out.println(ctx.getBean(Injected.class).appleEater);
}
@Component
static class Injected {
@Autowired
FruitEater<Orange> orangerEater;
@Autowired
FruitEater<Apple> appleEater;
}
}
@Configuration
@ComponentScan
class ConfigClass {
@Bean
public Apple apple() {
return new Apple();
}
@Bean
public Orange orange() {
return new Orange();
}
}
class Fruit {
}
class Apple extends Fruit {
}
class Orange extends Fruit {
}
@Component
class AppleEater extends FruitEater<Apple> {
}
@Component
class OrangeEater extends FruitEater<Orange> {
}
class FruitEater<ReturnType extends Fruit> {
@Autowired
protected ReturnType fruit;
}
或者,放弃组件扫描。使用构造函数注入。
public FruitEater(ReturnType fruit) {
this.fruit = fruit;
}
然后显式声明bean
@Bean
public FruitEater<Apple> appleEater() {
return new FruitEater(apple());
}
正如我所想的那样,我一直在解决一个算法问题并找到了解决方案。但没想到我遇到了一个奇怪的问题。 让我们假设我在英特尔第11代处理器java 8/17上有以下代码(两者都有): 把你的眼睛指向解决函数。 在这里我们有一个简单的解决方案,调用函数 n 次并测量所需的时间(我不使用 JMH,因为我的问题的测试系统使用简单的一次性时间测量)。在捕获开始时间之前,它使用内置的 函数按自然顺序对数组进行排序。
我对这个(可能是)简单的铸造示例有一个棘手的问题。你能帮帮我吗? 但更尴尬的是,我不知道为什么其他两种说法都没问题。 我看不出OtherIf和ChildIf之间有任何联系。那么,在案例1中,当这两个接口之间没有“扩展”时,如何将OtherIf强制转换为ChildIf呢?
我需要一些帮助来理解我的程序哪里出错了,我有一个非常简单的程序来学习多线程,但是每次我运行下面的代码时,它给我一个IllegalStateMonitorException。我不知道是什么原因造成的,虽然我怀疑它可能是我的同步块,谢谢。 主要方法类: 线程1: 线程2:
问题内容: 我实现了此处描述的副本构造函数。但是问题仍然是,当我更新时,会将相同的更新应用于。所以,我不明白我的代码有什么问题? 问题答案: 在复制构造函数中,您只是在进行浅表复制,而您需要进行深表复制: 在这里,您仍在复制的引用,该引用仍指向same 。您也应该对其进行修改以创建列表的副本。可能还需要像下面这样在arraylist中创建元素的副本:
我不懂pyplot。子地块(330 1 i)
只读操作: 有没有办法有一个MongoDB副本集,但要使连接到的框上的MongoDB实例成为被查询的MongoDB? 我在AWS负载平衡器后面有三个EC2实例。 在每个EC2实例上运行MongoDB,它是副本集的一部分。 我在nodeJS上有expressendpoint,我连接到副本集,如下所示 我希望在MongoDB副本集的所有三个实例上均匀分布查询负载,而不是默认情况下将所有查询路由到定义了
简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。 此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。 我们的数组是: [0 1 2 3 4 5] 调用 id() 函数: 139747815479536 a 赋值给 b: [0 1 2 3 4 5] b 拥有相
我有一个iframe,里面有一个小部件。源来自不同的域。在其内容上有一个带有提交按钮的表单。单击时,打开的页面位于iframe内。我的问题,我已经研究过了,但还没有找到答案,是这样的——“有没有办法让我可以访问那个按钮,这样新的页面就可以在一个单独的窗口中打开?” 谢谢你能提供的任何帮助。Stackoverflow规则。