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

我在浏览时多次看到这一点..人们正在使用自己的@Inject注释来注入EntityManager如下所示:

 @Inject @MyEm EnityManager em; 

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

基本上你需要做的是创建一个鉴别器注释并与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; } 

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

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