Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Diferença entre @Dispose e PreDestroy

Gostaria de saber se estou certo no meu entendimento

@Dispose é executado quando o objeto é passivado e @PreDestroy quando é destruido ?

4 respostas

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 ?

solução!

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.