Gostaria de saber se estou certo no meu entendimento
@Dispose é executado quando o objeto é passivado e @PreDestroy quando é destruido ?
Gostaria de saber se estou certo no meu entendimento
@Dispose é executado quando o objeto é passivado e @PreDestroy quando é destruido ?
Opa fala aí Alexandre, blz?
Então o @Dispose é utilizado somente para (ensinar ao CDI como) descartar objetos que foram produzidos com @Produces.
Já o @PreDestroy é um callback do ciclo de vida de um bean gerenciado pelo CDI (ou seja todos os beans gerenciados por ele vão chamar esse callback).
Espero ter ajudado!
Eu não entendi qual a necessidade de utilizar ambos como foi ensinado no curso de CDI. Lá há uma classe com algo mais ou menos assim
public void doSomething(@Dispose EntityManager em){
em.close();
}
@PreDestroy
public void doAnotherthing(){
em.close()
}
Por qual razão eu preciso de ambos? Não bastaria um ou outro ?
Fala aí Alexandre
Então no curso estamos usando da seguinte maneira:
@ApplicationScoped
public class JPAFactory {
private EntityManagerFactory emf = Persistence
.createEntityManagerFactory("algumaPU");
@Produces
@RequestScoped
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
@PreDestroy
public void preDestroy(){
if (emf.isOpen()) {
emf.close();
}
}
}
Temos um atributo do tipo EntityManagerFactory (uma fabrica de conexões com o banco de dados) que estamos inicializando(abrindo) ela com alguma PersistenceUnit.
Estamos produzindo o EntityManager (que representa uma conexão com o banco de dados) no método getEntityManager com a anotação @Produces.
Depois estamos fechando o EntityManager (conexão com banco) através do método close e usando o @Disposes
Por fim estamos fechando o EntityManagerFactory (a fabrica) no @PreDestroy.
Exatamente como tinha mencionado anteriormente o @Dispose serve somente para descartar objetos que foram produzidos com @Produces.
Já a anotação @PreDestroy é um callback do ciclo de vida do seu objeto.
Neste exemplo estamos pedindo para o CDI criar nosso objeto JPAFactory com o escopo de aplicação e o CDI viu que sempre que alguém pedir injetado um EntityManager ele tem que invocar o método getEntityManager dessa classe JPAFactory.
Quando algum objeto que pediu um EntityManager não precisar mais do EntityManger, o CDI irá invocar o método close da classe JPAFactory para fechar a conexão.
Por fim quando paramos nosso servidor, precisamos fechar a fabrica de conexões e aí entra o @PreDestroy da classe JPAFactory.
Muito obrigado Fernando.