Como chamar um método após a boot do bean estar completa?

Eu tenho um caso de uso em que eu preciso chamar um método (não estático) no bean somente uma vez no ApplicationContext carregar. Tudo bem, se eu usar MethodInvokingFactoryBean para isso? Ou nós temos uma solução melhor?

Como uma nota lateral, eu uso ConfigContextLoaderListener para carregar o contexto do aplicativo no aplicativo da web. E quer que, se o bean ‘A’ for instanciado, chame methodA () uma vez.

Como isso pode ser feito bem?

Você pode usar algo como:

   

Isso chamará o método “init” quando o bean for instanciado.

Para expandir a sugestão @PostConstruct em outras respostas, essa é realmente a melhor solução, na minha opinião.

  • Ele mantém seu código desacoplado da API Spring (@PostConstruct está em javax. *)
  • Anota explicitamente seu método init como algo que precisa ser chamado para inicializar o bean
  • Você não precisa se lembrar de adicionar o atributo init-method à sua definição de bean de mola, o spring chamará automaticamente o método (assumindo que você registre a opção annotation-config em algum outro lugar no contexto, de qualquer forma).

Existem três abordagens diferentes a considerar, conforme descrito na referência

Use o atributo init-method

Prós:

  • Não requer que o bean implemente uma interface.

Contras:

  • Não há indicação imediata de que este método é necessário após a construção para garantir que o bean esteja configurado corretamente.

Implementar InitializingBean

Prós:

  • Não há necessidade de especificar o método init ou ativar o processamento de verificação / anotação de componentes.
  • Apropriado para beans fornecidos com uma biblioteca, onde não queremos que o aplicativo que usa esta biblioteca se preocupe com o ciclo de vida do bean.

Contras:

  • Mais invasivo que a abordagem do método init.

Use a anotação lifecyle @PostConstruct do JSR-250

Prós:

  • Útil ao usar a varredura de componentes para autodetectar beans.
  • Torna claro que um método específico deve ser usado para boot. A intenção está mais próxima do código.

Contras:

  • A boot não é mais especificada centralmente na configuração.
  • Você deve se lembrar de ativar o processamento de annotations (que às vezes pode ser esquecido)

Você tentou implementar o InitializingBean ? Parece exatamente o que você está procurando.

A desvantagem é que seu bean se torna ciente do Spring, mas na maioria dos aplicativos não é tão ruim.

Você poderia implantar um BeanPostProcessor personalizado em seu contexto de aplicativo para fazer isso. Ou, se você não se importar em implementar uma interface Spring em seu bean, poderá usar a interface InitializingBean ou a diretiva “init-method” (mesmo link).

Para esclarecer ainda mais qualquer confusão sobre as duas abordagens, ou seja, o uso de

  1. @PostConstruct and
  2. init-method="init"

Por experiência pessoal, percebi que o uso de (1) funciona apenas em um contêiner de servlet, enquanto (2) funciona em qualquer ambiente, mesmo em aplicativos de desktop. Então, se você estivesse usando o Spring em um aplicativo independente, você teria que usar (2) para realizar o “chamar este método após a boot.

    Intereting Posts