Sto provando a creare un'applicazione utilizzando solo JPA, CDI (OpenWebBeans + Deltaspike JPA module), JSF. Sto usando il CDI distribuito su Tomcat nello stesso modo in cui sono abituato a usare il framework Spring. Ho DAO chiamato GenericDAOImpl come questa (prime linee):Quale ambito CDI deve essere utilizzato per le classi DAO e Service
public abstract class GenericDaoJpa<T> implements GenericDao<T> {
private static final Log logger = LogFactory.getLog(GenericDaoJpa.class);
@Inject
protected EntityManager entityManager;
private Class<T> type;
EntityManager viene iniettato utilizzando DeltaSpike JPA modulehttp: //deltaspike.apache.org/jpa.html. Questo genericoDao viene quindi ereditato da DAO (UserDao ecc.) In calcestruzzo, utilizzato dalle classi di servizio.
Ad esempio UserServiceImpl:
public class UserServiceImpl implements UserService {
private static final Log logger = LogFactory.getLog(UserServiceImpl.class);
@Inject
private UserDao userDao;
@Transactional
public void saveUser(UserDto user) throws UserServiceException {
try {
User u = new User(user);
userDao.create(u);
} catch (Exception e) {
logger.error("Error while creating user.", e);
throw new UserServiceException("Error while creating user.");
}
}
}
Utilizzando CDI questo modo sia DAO e classe di servizio avrà portata Dependent differenza in primavera dove sarebbero Singleton. Pertanto ogni client avrà una nuova istanza iniettata. Devo cambiare gli ambiti su DAO e le classi di servizio su ApplicationScope? Ma poi con le specifiche devo rendere serializzabili tutte le classi che vengono iniettate. In caso di classi di Dao questo potrebbe essere un problema, EntityManager dovrebbe quindi essere contrassegnato come transitorio? A
Sarei felice per qualsiasi raccomandazione.
Grazie per la risposta. Nel caso utilizzassi @ApplicationScoped, mi aspetterei che, come in primavera, il bean (il singleton con scope in primavera) fosse accessibile più volte contemporaneamente. Pertanto non ci sarebbero problemi di prestazioni. L'unica preoccupazione da parte mia sarebbe quella di rendere sicuro il filo della classe. O la concorrenza non viene gestita automaticamente dal contenitore CDI? –
La concorrenza non viene gestita dal contenitore CDI. –