Em um bean gerenciado, @PostConstruct
é chamado após o construtor de objeto Java comum.
Por que eu usaria @PostConstruct
para inicializar por bean, em vez do próprio construtor regular?
Em um bean gerenciado, @PostConstruct
é chamado após o construtor de objeto Java comum.
Por que eu usaria @PostConstruct
para inicializar por bean, em vez do próprio construtor regular?
final
. Dado esse padrão, por que está@PostConstruct
sendo adicionado ao J2EE - eles devem ter visto outro caso de uso com certeza?Respostas:
porque quando o construtor é chamado, o bean ainda não foi inicializado - ou seja, nenhuma dependência é injetada. No
@PostConstruct
método, o bean é totalmente inicializado e você pode usar as dependências.porque este é o contrato que garante que esse método será chamado apenas uma vez no ciclo de vida do bean. Pode acontecer (embora improvável) que um bean seja instanciado várias vezes pelo contêiner em seu trabalho interno, mas garante que
@PostConstruct
será invocado apenas uma vez.fonte
O principal problema é que:
* obviamente excluindo injeção de construtor
Exemplo do mundo real:
IMPORTANTE :
@PostConstruct
e@PreDestroy
foram completamente removidos no Java 11 .Para continuar usando-os, você precisará adicionar o JAR javax.annotation-api às suas dependências.
Maven
Gradle
fonte
in a constructor, the injection of the dependencies has not yet occurred.
true com injeção de setter ou campo, mas não com injeção de construtor.Se sua classe executa toda a sua inicialização no construtor, então
@PostConstruct
é realmente redundante.No entanto, se sua classe tiver suas dependências injetadas usando métodos setter, o construtor da classe não poderá inicializar completamente o objeto e, algumas vezes, alguma inicialização precisará ser executada após todos os métodos setter terem sido chamados, daí o caso de uso de
@PostConstruct
.fonte
Considere o seguinte cenário:
Como o carro precisa ser instanciado antes da injeção no campo, o mecanismo do ponto de injeção ainda é nulo durante a execução do construtor, resultando em uma NullPointerException.
Esse problema pode ser resolvido pelo JSR-330 Dependency Injection for Java construtor ou pelo JSR 250 Common Annotations para a anotação do método Java @PostConstruct.
@PostConstruct
O JSR-250 define um conjunto comum de anotações que foi incluído no Java SE 6.
A anotação @PostConstruct permite a definição de métodos a serem executados após a instância ter sido instanciada e todas as injeções terem sido executadas.
Em vez de executar a inicialização no construtor, o código é movido para um método anotado com @PostConstruct.
O processamento de métodos pós-construção é uma questão simples de encontrar todos os métodos anotados com @PostConstruct e invocá-los por vez.
O processamento dos métodos pós-construção deve ser realizado após a conclusão da instanciação e injeção.
fonte
Também a inicialização baseada em construtor não funcionará como pretendido sempre que algum tipo de proxy ou remoting estiver envolvido.
O ct será chamado sempre que um EJB for desserializado e sempre que um novo proxy for criado para ele ...
fonte