gpt4 book ai didi

java - Spring 4对抽象泛型类的依赖注入(inject)不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:20 36 4
gpt4 key购买 nike

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

在将第二个参数U添加到基类XY(并因此添加到其所有子类)之前,这实际上是可行的。但是添加之后,这是Spring初始化期间的错误:


  org.springframework.beans.factory.UnsatisfiedDependencyException:
  创建名称为“ myApp”的bean时出错:不满意的依赖关系
  通过字段“ x1”表示;嵌套异常为
  org.springframework.beans.factory.UnsatisfiedDependencyException:
  创建名称为'xImpl1'的bean时出错:不满意的依赖关系
  通过字段“ y”表示;嵌套异常为
  org.springframework.beans.factory.NoSuchBeanDefinitionException:否
  类型为“ test.Y>”的合格bean
  可用:至少需要1个符合自动装配条件的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<T, U>Y<T, U>相互引用:

@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<A, B>的唯一子类):

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class XImpl1 extends X<A, B> {
// ...
}


与上述相同- Y<A, B>的唯一实现。尽管 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:就是你。

我会说您的设计不必要地复杂。

我不知道这是一个例子还是您的真实代码。您对泛型的命名和使用使它无法阅读和理解。您已经从类层次结构中抽象出了所有理解。

这听起来像是应该优先于继承而不是继承的情况。那只是我的意见。

当您使用@Autowire构造函数时,我建议将@Qualifier添加到参数列表中,并使用一个值准确说明要注入的bean。如果您有多个相同类型的bean由bean工厂管理,那么期望Spring会读懂您的想法是不合理的。它无法选择自动接线。只有您可以决定。

世界正朝着功能编程的方向发展,而不是面向对象。我很想知道您是否可以通过使用lambdas和新的java.util.function包对此进行改进。您可能会获得更大的灵活性和更好的理解。

关于java - Spring 4对抽象泛型类的依赖注入(inject)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45420872/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com