我有基类x
和y
,它们有多个实现。但是,每个参数化类型只有一个实现,因此@autowired
应该能够确定需要哪个子类。
在将第二个参数u
添加到基类x
和y
(从而添加到它们的所有子类)之前,这实际上是有效的。但是在添加了这些之后,下面是Spring初始化期间的错误:
UnsatisfiedDependencyException:创建名为“My App”的bean时出错:通过字段“x1”表示的未满足的依赖项;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“XIMPL1”的bean时出错:通过字段“y”表示的未满足的依赖项;嵌套异常为org.springframework.beans.factory.noSuchBeanDefinitionException:没有“test.y>”类型的合格bean可用:至少需要一个合格的自动候选bean。依赖项注释:{@org.SpringFramework.Beans.Factory.Annotation.AutoWired(required=true)}
github中的代码(maven项目):https://github.com/kevincentius/spring-di-abstract-generic-problem/tree/master/spring-test
抽象泛型类x
和y
相互引用:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public abstract class X<T, U> {
protected T t;
protected U u;
@Autowired
protected Y<T, X<T, U>> y; // error when initializing xImpl1
// ...
}
类Y
知道实现类V
(例如XIMPL1
)。与x
相反,后者只知道抽象类y
而不知道它的实现类型(例如yimpl1
)。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public abstract class Y<T, V extends X<T, ?>> {
protected T t;
protected V v;
// ...
}
pojo类:
public class A {
// pojo
}
一个简单的界面:
public interface B {
// ...
}
这只是x
的子类之一,但这是x
中唯一具有参数化类型a
和b
的子类(即x
的唯一子类):
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class XImpl1 extends X<A, B> {
// ...
}
与上面一样-y
的唯一实现。尽管y
的其他实现具有不同的参数化类型。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class YImpl1 extends Y<A, XImpl1> {
// ...
}
最后使用以下实现:
@Component
public class MyApp {
@Autowired
XImpl1 x1; // error
}
可能是有用的信息:
如果我将类X和Y设置为非抽象的,初始化错误就会消失,但是即使XImpl1重写了X上的方法,在依赖注入之后,这也不适用!即在MyApp中,调用x1.something()实际上并不调用XImpl1的方法,而是调用X类的something()方法。
我可能在这里犯了一些错误,如果有人能指出点什么,我会很高兴的。但除此之外,似乎Spring还是有一些局限性的?
我不知道Spring的限制。我建议简化。不要再假设问题出在Spring:问题出在你身上。
我会说你的设计是不必要的复杂。
我不知道这是一个例子还是你的真实代码。您对泛型的命名和使用使其无法阅读和理解。您已经从这个类层次结构中抽象出了所有的理解。
世界正朝着函数式编程的方向发展,而不是面向对象。我很想知道您是否可以通过使用lambdas和新的java.util.function包来改进这一点。您可能会获得更多的灵活性和更好的理解。
在Micronaut中尝试java泛型类的依赖注入 接口 依赖注入 接口 实施 对我来说,问题是在ServiceBus类上,我如何传递公共记录ServiceBus的类型 当我呼叫iserviceBus时。 同样,如果我调用iserviceBus。
我做了一个名为AcessoCliente的单例类 但我需要对我的单例类执行一个名为ValidadorNivelDeAcessoBusiness的类的依赖注入
问题内容: 我需要使用spring框架在抽象超类中注入依赖项。 我每次实例化Abstract class B时都需要传递超类依赖关系(可以在我的项目中以100多种方式将其子类化) application.xml(Spring上下文文件)中的条目 我如何才能在application.xml中创建超类AbstractClassB的bean引用,以便可以在所有子类bean创建中使用它? 问题答案: 你可
问题内容: 如何将Spring依赖注入到我编写的扩展AbstractTestExecutionListener的TestExecutionListener类中? Spring DI似乎不适用于TestExecutionListener类。问题示例: AbstractTestExecutionListener: 配置文件: JUnit测试文件: 如代码注释中突出显示的那样,当我运行此代码时,它将打印
我来自Java背景,也是函数范式的新手,所以请原谅我,我身上有OOP的味道。 我有一个特征名称付款处理程序 和 直到这里一切都很好,但是当我想拥有多个基于付款方式的支付网关时,问题就来了。最初我写了一个像 PaymentHandlerFactory 这样的 然后使用这个PaymentHandlerFactory获取guice注入的PayPal对象。但不知怎的,我觉得这不是正确的方法,于是我找到了同
我试图在Scala中返回抽象泛型类的子类,但它无法编译。我得到A类型的表达式不符合预期的B类型。这是我使用的代码: 创建()的签名应该是什么? 谢谢