如何使用@Inject批注在Java中堆叠自定义批注

时间:2012-01-07 14:40:17

标签: java java-ee annotations cdi

我在浏览时多次看到这种情况..人们正在使用@Inject注释自己注入EntityManager这样:

@Inject @MyEm EnityManager em;  

因为你不能只注入EntityManager。您只能使用@PersistenceContext执行此操作。有没有人知道如何使这项工作(使用自定义注释),因为我没有在网上找到任何信息?如果可以,请举个例子。

2 个答案:

答案 0 :(得分:3)

基本上你需要做的是创建一个鉴别器注释并与Producer一起使用它。这使您可以在Java EE应用程序中的其他bean中简单地@Inject您的实体管理器。这是一个例子:

@Qualifier
@Retention(RUNTIME)
@Target(METHOD, FIELD, PARAMETER, TYPE)
public interface @MyEm {
}

public class EntityProducer {
    @PersistenceContext(unitName = 'MyPU', type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    @Produces
    @MyEm
    public EntityManager getEntityManager() {
        return entityManager;
    }
}

public class MyDAO {
    @Inject
    @MyEm
    private EntityManager entityManager;
}

答案 1 :(得分:2)

这被称为“限定词”。每个CDI教程都应该解释它们。简而言之:

  • 创建您自己的注释,并使用@Qualifier
  • 对其进行注释
  • 在实现某个接口的具体类上使用限定符注释,或者在创建实例的生成器方法上使用限定符注释
  • 在注入点使用自定义注释来区分界面的两个或更多实现