import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import com.mycompany.project.ABean;
@Named
@RequestScoped
public class ManagedBean {
@Inject ABean abean;
// Construtor...
public ManagedBean() {
// abean é null. Se eu chamar qualquer método de abean eu vou obter NullPointerException.
}
@PostConstruct
protected void myInit() {
abean.doSomethind(); // aqui tudo bem!!!
}
}
A injeção de dependências permite que vc escreva uma classe sem se preocupar em instanciar as dependências dessa classe.
Campos anotados com @Inject (CDI), @EJB, @PersistenceContext, @PersistenceUnit, @Resource e @ManagedProperty (JSF2)
são inicializados pelo próprio servidor JEE logo após o seu ManagedBean ser criado. Isso torna o seu código menor, mais simples,
provê uma maior separação entre as classes e facilita a manutenção do código. Principalmente se vc comparar com o jeito antigo
de se obter objetos gerênciados (EJBs, DataSources, ManagedBean e etc.):
Context ctx = new InitialContext();
ABean abean = (ABean) ctx.lookup("java:comp/env/ABean"); // ou algo assim...
O problema é que o servidor só pode injetar esses campos num objeto após a JVM ter terminado de construir o objeto, ou seja, após
o fim do construtor. Assim, campo injetados não estarão disponíveis ao objeto durante a execução do seu construtor. O callback
@PostConstrut te oferece uma funcionalidade similar à de um construtor porém executada após o termino do processo de injeção.
Assim vc pode realizar quaisquer processamentos que dependam desses objetos. De fato não há nada de errado em usar o construtor
de um ManagedBean realizar inicialização, isso apenas não funciona se essa inicialização depender de algum objeto que será injetado pelo
servidor no seu ManagedBean. Para isso vc deve usar os Callbacks.
E da mesma maneira que vc possui o callback @PostConstruct, para inicializar um ManagedBean, existe também o callback @PreDestroy, para
finaliza-lo. O uso de @PreDestroy é deve ser preferível ao método finalize() pois métodos anotados com @PreDestroy são chamados pelo servidor
assim que o escopo de um ManagedBean termina. Use-o para liberar recursos como conexões com o Banco ou Stateful Session Beans.