Производители CDI не так сложны, см. Следующий пример.
Следующие классы являются аннотациями CDI-Qualifier, которые используются для различения реализаций.
@Retention(RetentionPolicy.RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR })
@Qualifier
public @interface MyfirstPUQualifier { }
@Retention(RetentionPolicy.RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR })
@Qualifier
public @interface MysecondPUQualifier { }
bean-компонент CDI, который внедряет различные EntityManager и реализует методы производителя, делая два EntityManager доступными для CDI, различаемых с помощью CDI-Qualifiers
@ApplicationScoped
class MYProducer {
@PersistenceContext(unitName = "myfirstPU")
private EntityManager firstEm;
@PersistenceContext(unitName = "mysecondPU")
private EntityManager secondEm;
@Produces
@RequestScoped
@MyfirstPUQualifier
public EntityManager produceMyfirstPU(){
return firstEm;
}
@Produces
@RequestScoped
@MysecondPUQualifier
public EntityManager produceMysecondPU(){
return secondEm;
}
}
Ниже показан CDI-бин, внедряющий оба EntityManager.Это может быть извлечено в абстрактный базовый класс, потому что может быть необходимо и другим DAO.
@Stateless
public class FileDao {
@Inject
@MyfirstPUQualifier
private EntityManager emFirst;
@Inject
@MysecondPUQualifier
private EntityManager emSecond;
public void myDaoMEthod(){
final EntityManager em = getEntityManager();
...
}
private EntityManager getEntityManager(){
if(condition1){
return emFirst;
}
else if(condition2){
return emSecond;
}
}
}
Нет, нельзя использовать bean-компонент FileDao, не заботясь о том, какой EntityManager использовать, потому что в этом не следует принимать решениебоб в любом случае
@Stateless
@LocalBean
public class FileBusiness {
@EJB
FilesDao fileDao;
public void myMethod(){
// FileDao will decide what entity manager to use
fileDao.doStruff();
}
}