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.