当前位置: 首页 > 知识库问答 >
问题:

Spring4对抽象泛型类的依赖注入不起作用

常甫
2023-03-14

我有基类xy,它们有多个实现。但是,每个参数化类型只有一个实现,因此@autowired应该能够确定需要哪个子类。

在将第二个参数u添加到基类xy(从而添加到它们的所有子类)之前,这实际上是有效的。但是在添加了这些之后,下面是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中唯一具有参数化类型ab的子类(即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还是有一些局限性的?

共有1个答案

公羊子真
2023-03-14

我不知道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类型。这是我使用的代码: 创建()的签名应该是什么? 谢谢