Existe alguma diferença entre usar a @PostConstruct
anotação e declarar o mesmo método init-method
da configuração Spring XML?
Não, praticamente não acho que haja alguma diferença, mas há prioridades na forma como funcionam. @PostConstruct
, init-method
são BeanPostProcessors.
@PostConstruct
é uma anotação JSR-250 enquanto init-method
é a maneira do Spring de ter um método de inicialização.@PostConstruct
método, ele será chamado primeiro, antes que os métodos de inicialização sejam chamados.afterPropertiesSet
, primeiro @PostConstruct
é chamado, depois o afterPropertiesSet
e então init-method
.Para mais informações, você pode verificar a documentação de referência do Spring .
Antes das especificações JSR 250, o uso do método init em xml era a forma preferida, uma vez que desacopla classes java (beans) de quaisquer classes / anotações específicas de spring. Portanto, se você estiver construindo uma biblioteca que não precisa ser dependente de beans de infraestrutura de spring então, o uso do método init foi preferido. Durante o método de criação, você pode especificar o método que precisa ser chamado como método de inicialização.
Agora, com a introdução das especificações JSR 250 no Java EE e o suporte do spring para essas anotações, a dependência do framework do spring foi reduzida até certo ponto.
Mas tenho que admitir que a adição dessas coisas aumenta a legibilidade do código. Portanto, há prós e contras em ambas as abordagens.
Não há diferença real. Depende de como você prefere configurar seu sistema e isso é uma questão de escolha pessoal. Eu mesmo prefiro usar
@PostConstruct
anotações para meu próprio código (já que o bean só é configurado corretamente depois que o método é chamado) e eu usoinit-method
ao instanciar beans de bibliotecas não compatíveis com Spring (não é possível aplicar anotações lá, é claro!) mas posso entender totalmente as pessoas que desejam fazer tudo de uma forma ou de outra.fonte
@postconstruct não faz parte da primavera. Faz parte do pacote javax. Ambos são iguais. usando o método init, precisamos adicionar no arquivo xml. Se você usar @postconstruct, adicionar no xml não é necessário. Confira o artigo abaixo.
http://answersz.com/spring-postconstruct-and-predestroy/
fonte
Como você pode ver no diagrama abaixo de Bean Creation Life-Cycle Callback .
Esta 3 etapa acontece no retorno de chamada do ciclo de vida da criação do feijão:
@PostConstruct
será chamado.InitializingBean
for implementado, entãoafterPropertiesSet()
será chamado.init-method
ou@Bean(initmethod="..")
então chama o método init.Este diagrama é do Pro Spring 5: um guia detalhado para o Spring Framework e suas ferramentas
fonte
Não pode ser diferença entre
@PostConstruct
einit-method
porque@PostConstruct
é tratada napostProcessAfterInitialization
fase de inicialização de feijão (AbstractAutowireCapableBeanFactory.initializeBean()
método) porCommonAnnotationBeanPostProcessor
, enquantoinit
método é chamado após a conclusão dapostProcessBeforeInitialization
fase (e, por esta matéria, antes do início dapostProcessAfterInitialization
fase).EDIT : Então, a sequência é: 1)
postProcessBeforeInitialization
fase, 2)init
método é chamado, 3)postProcessAfterInitialization
fase, que chama@PostConstruct
método(Como uma nota lateral, uma declaração da resposta aceita
não está totalmente correto:
@PostConstruct
é tratado por umBeanPostProcessor
, oinit
método não é.)Não serão diferença se alguns (potencialmente personalizado)
BeanPostProcessor
, que é configurado com (Ordered.getOrder()
) a ser executado depoisCommonAnnotationBeanPostProcessor
, está fazendo algo sério em seupostProcessBeforeInitialization
método.Não há nenhuma diferença com a configuração padrão do Spring
BeanPostProcessors
porque todos osBeanPostProcessors
que são configurados para serem executados depoisCommonAnnotationBeanPostProcessor
, não fazem nada nopostProcessBeforeInitialization
método.Concluindo, a resposta aceita e as semelhantes estão certas ... em 99% dos casos, e este post é apenas uma homenagem ao conceito "o diabo está nos detalhes"
fonte
Código completo aqui: https://github.com/wkaczurba/so8519187 ( spring-boot )
Usando anotações:
Nos dá:
fonte