it-swarm-pt.tech

Atributo Spring @PostConstruct vs. init-method

Existe alguma diferença entre usar a anotação @PostConstruct e declarar o mesmo método que init-method na configuração Spring XML?

87
Jan Zyka

Não, praticamente não acho que haja diferença, mas há prioridades na maneira de trabalhar. @PostConstruct, init-method são BeanPostProcessors.

  1. @PostConstruct é uma anotação JSR-250, enquanto init-method é a maneira da Spring de ter um método de inicialização.
  2. Se você tiver um método @PostConstruct, isso será chamado antes dos métodos de inicialização serem chamados.
  3. Se seu bean implementa InitializingBean e substitui afterPropertiesSet, primeiro @PostConstruct é chamado, então afterPropertiesSet e, em seguida, init-method.

Para mais informações, você pode verificar o Spring's documentação de referência .

Antes das especificações do JSR 250, o uso do método init em xml era o preferido, já que separa Java classes (beans) de qualquer classe/anotação específica da primavera.Então se você está construindo uma biblioteca que não precisa ser dependente de beans de infraestrutura de mola, em seguida, 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 do JSR 250 em Java EE e suporte a mola dessas anotações, a dependência da estrutura de mola foi reduzida até certo ponto.

Mas eu tenho que admitir que a adição dessas coisas aumenta a legibilidade do código. Então, há prós e contras de ambas as abordagens.

143
Aravind A

Não há diferença real. É como você prefere configurar seu sistema, e isso é uma questão de escolha pessoal. Eu prefiro usar anotações @PostConstruct para o meu próprio código (como o bean só é configurado corretamente depois que o método é chamado) e eu uso init-method ao instanciar beans de bibliotecas que não são Spring (não posso aplicar anotações lá, é claro !), mas eu posso entender totalmente as pessoas que querem fazer tudo de uma forma ou de outra.

18
Donal Fellows

@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 adicionando em xml não é necessário. Confira o artigo abaixo.

http://answersz.com/spring-postconstruct-and-predestroy/

4
Amruth M Raj

Existe pode ser diferença entre @PostConstruct e init-method porque @PostConstruct é manipulado na fase postProcessAfterInitialization da inicialização do bean (AbstractAutowireCapableBeanFactory.initializeBean() method) por CommonAnnotationBeanPostProcessor, enquanto init-method é chamado após a conclusão da fase postProcessBeforeInitialization (e, nesse caso, antes do início da fase postProcessAfterInitialization).
(Portanto, uma declaração da resposta aceita

@PostConstruct, init-method são BeanPostProcessors

não é totalmente correto: @PostConstruct é tratado por um BeanPostProcessor, init-method não é.
There will be difference if alguma (potencialmente customizada) BeanPostProcessor, que é configurada (Ordered.getOrder()) para ser executada após CommonAnnotationBeanPostProcessor, está fazendo algo sério em seu método postProcessBeforeInitialization.
There is no qualquer diferença com a configuração Spring padrão de BeanPostProcessors porque todos os BeanPostProcessors que estão configurados para serem executados após CommonAnnotationBeanPostProcessor, não fazem nada no método postProcessBeforeInitialization.
Em conclusão, a resposta aceita e a similar estão certas ... em 99% dos casos, e este post é apenas para prestar uma homenagem a um conceito "o diabo está nos detalhes"

1
igor.zh

Código completo aqui: https://github.com/wkaczurba/so8519187 ( spring-boot )

Usando anotações:

@Slf4j
@Component
public class MyComponent implements InitializingBean {

    @Value("${mycomponent.value:Magic}")
    public String value;

    public MyComponent() {
        log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
    }

    @PostConstruct
    public void postConstruct() {
        log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
    }

    @Override // init-method; overrides InitializingBean.afterPropertiesSet()
    public void afterPropertiesSet() {
        log.info("MyComponent in afterPropertiesSet: [{}]", value);  // (2) displays: Magic
    }   

    @PreDestroy
    public void preDestroy() {
        log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
    }
}

Nos dá:

Atualizando org.springframework.context ...

MyComponent no construtor: [null]
MyComponent em postConstruct: [Magic]
MyComponent em afterPropertiesSet: [Magic]
...

Registrando beans para exposição JMX na inicialização
Iniciou o DemoApplication em 0.561 segundos (JVM em execução para 1.011)
Fechando org.springframework.context ... Cancelando o registro de beans expostos ao JMX no desligamento

...
MyComponent em preDestroy: [Magic]

1
Witold Kaczurba