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

使用抽象Spring bean作为构造函数-arg

汪甫
2023-03-14

我们在代码库中有一个处理程序类的层次结构,它们实现了一种责任链原则。有一个抽象父类,它由几个子类扩展,这些子类也在其构造函数中接收抽象

public abstract class AbstractHandler {
  public AbstractHandler(final AbstractHandler next, final PropertyName propertyName) {
    this.next = next;
    this.propertyName = propertyName;
  }
  ...  

public class OneConcreteChildHandler extends AbstractHandler {
  public OneConcreteChildHandler(final AbstractHandler next) {
    super(next, PropertyName.OneConcreteChild);
  }
  ...

我们现在需要将具体子类之一的实例注入到新实现的服务类中,我们应该用XML来配置它。我们可以为抽象父类配置一个抽象bean,但这个bean似乎不被允许用作具体子bean的构造函数-arg

<bean id="abstractHandler" abstract="true" class="...AbstractHandler" />

<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler">
    <constructor-arg ref="abstractHandler"/> //"abstract bean can not be used here"
</bean>

<bean id="someService" class="...SomeService">
    <constructor-arg ref="oneConcreteChildHandler"/>
    ...

有什么办法可以克服这一点吗?处理程序类层次结构是遗留代码,我们现在无法修改它们的源代码。

共有1个答案

鲁波光
2023-03-14

这里的主要问题是您试图注入一个抽象bean。你不应该这么做。这个AbstractHandler应该只用于映射子bean中的父级。尽管如此,它并不是你真正想要/需要的。您不会在此构造函数中传递抽象对象,而是传递另一个子类的对象。您的链必须有一个结束点,其中构造函数的参数next将为null,如下所示:

<bean id="abstractHandler" abstract="true" class="...AbstractHandler" />

<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler">
        <constructor-arg ref="twoConcreteChildHandler"/>
    </bean>

<bean id="twoConcreteChildHandler" class=".." parent="abstractHandler">
    <constructor-arg name="next">
        <null />
    </constructor-arg>
</bean>

<bean id="someService" class="...SomeService">
    <constructor-arg ref="oneConcreteChildHandler"/>
    ...
 类似资料:
  • 问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条

  • 序对 为了在具体的表面上实现这一数据抽象,scheme 提供了一种称为 序对 的复合结构,这种结构可以通过 cons 构造出来。过程 cons 取两个参数,返回一个包含这两个参数作为其成分的符合数据对象。其实个人理解就是二维数据描述,可以抽象的理解成平面点。 给出一个序对,可以用基本过程 car 和 cdr 方式取出。 (define x (cons 1 2)) (car x) 1 (cdr

  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?

  • 问题内容: 根据Node.js手册: 如果您希望模块导出的根是一个函数(例如构造函数),或者想一次导出一个完整的对象而不是一次构建一个对象,则将其分配给module.exports而不是export 。 给出的示例是: 并像这样使用: 我的问题:为什么示例不使用正方形作为对象?以下内容是否有效,是否会使示例更加“面向对象”? 问题答案: CommonJS模块允许两种方法来定义导出的属性。无论哪种情

  • 问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不

  • TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数