【问题标题】:Is it possible to obtain a reference of containing class (CDI)?是否可以获得包含类(CDI)的引用?
【发布时间】:2026-02-13 23:55:01
【问题描述】:

我的设置如下 -

public class ParentModel {
    private StatusModel sm;
}

StatusModel 类如下 -

public class StatusModel {
    private ParentModel pm;

    public void setParentModel(ParentModel pm) {
        this.pm = pm;
    }
}

StatusModel 内的pmParentModel 实例的引用,StatusModel 所依赖的实例。

dao 内部-我正在注入ParentModel,如下所示

@Inject
private Instance<ParentModel> factory;

但是,使用下面的单独方法调用将ParentModel 引用设置为StatusModel -

pm = factory.get();
pm.setters...
pm.getSm().setParentModel(pm);//<----- is it possible to avoid this?

我们可以在不调用方法的情况下获得sm 内部的pm 引用吗?

【问题讨论】:

  • 这是一个循环依赖,DI容器没有明确的方法来正确确定创建对象的顺序。横向建议:不要;相反,将StatusModel 需要的功能提取到一个新类中,您可以将其注入到它和ParentModel 中。

标签: java cdi weld jboss-weld weld2


【解决方案1】:

根据哪个对象可能(无论多么短暂)处于未完全初始化状态,将该对象作为构造函数参数注入另一个对象,并在那里调用setter。当您解析后一个对象时,整个对象层次结构将保持一致:

class ParentModel {
    StatusModel _status;
    ParentModel(@Inject StatusModel status) {
        _status = status;
        _status.setParent(this);
    }
}

class StatusModel {
    ParentModel _parent;
    void setParent(ParentModel parent) { _parent = parent);
}

也就是说,我建议打破这种循环依赖关系,因为这样你就可以恢复设计的一个很好的属性,它不可能构造无效对象。

【讨论】:

    最近更新 更多