You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需用注解重写CDI方法?如何免重写实现持久化Bean生产

问题解答

这种情况是否正常?

是的,这属于CDI(上下文与依赖注入)规范下的正常现象:

  • @Produces和@Disposes这类CDI特定注解不会随方法继承,父类方法即使包含业务逻辑,缺少这两个注解时,CDI无法识别其为Bean生产者/销毁器。
  • 父类方法的protected修饰符仅保证子类可继承方法逻辑,但CDI需要明确的注解标识来关联生产者与销毁器的绑定关系,这类标识无法通过继承自动传递。

如何让子类无需重写方法即可工作?

可以通过修改父类的注解配置,让CDI直接识别父类中的生产者与销毁器方法,子类仅需简单继承即可:

修改父类注解配置

直接在父类的生产者方法上添加@Produces,销毁方法上添加@Disposes:

public abstract class __PersistenceProducer {

    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
    public @interface Memory__ {

    }

    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
    public @interface Remote__ {

    }

    protected __PersistenceProducer() {
        super();
    }

    @Memory__
    @Produces
    protected EntityManager produceMemoryEntityManager(final EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Disposes
    protected void disposeMemoryEntityManager(@Memory__ final EntityManager entityManager) {
        entityManager.close();
    }

    @Remote__
    @Produces
    protected EntityManager producePhysicalEntityManager(final EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Disposes
    protected void disposePhysicalEntityManager(@Remote__ final EntityManager entityManager) {
        entityManager.close();
    }
}

简化子类实现

修改后子类无需重写任何方法,空实现即可继承父类所有生产者/销毁器逻辑:

class _PersistenceProducer extends __PersistenceProducer {
    // 仅保留构造方法或空实现,无需重写父类方法
}

验证效果

你的测试类__MappedEntityPersistenceMemoryTest和_MappedEntityPersistenceMemoryTest的注入逻辑无需修改,依然可以正常获取带有@Memory__限定符的EntityManagerFactory和EntityManager实例。

内容的提问来源于stack exchange,提问作者Jin Kwon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:28:23