是否需用注解重写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
相关产品推荐
相关产品推荐

