Gostaria de saber se estou certo no meu entendimento
@Dispose é executado quando o objeto é passivado e @PreDestroy quando é destruido ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.