Pergunta

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

Como uma nota lateral, eu uso ConfigContextLoaderListener para carregar o contexto do aplicativo no aplicativo web. E quer, que, se de feijão 'A' é instanciado apenas chamar MethodA () uma vez.

Como isso pode ser feito bem?

Foi útil?

Solução

Você pode usar algo como:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Isso irá chamar o método "init" quando o bean é instanciado.

Outras dicas

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

  • Ele mantém o seu código desacoplado da API Primavera (@PostConstruct está em javax. *)
  • Ele anota explicitamente o seu método init como algo que precisa ser chamado para inicializar o feijão
  • Você não precisa se lembrar de adicionar o atributo-método init para a sua definição de feijão primavera, Primavera irá automaticamente chamar o método (supondo que você registrar a opção de anotação-config em outro lugar no contexto, de qualquer maneira).

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

Use o init-method atributo

Pros:

  • não necessita de feijão para implementar uma interface.

Contras:

  • Nenhuma indicação imediata este método é necessário após a construção para assegurar o feijão está correctamente configurado.

Implementar InitializingBean

Pros:

  • Não há necessidade de especificar init-método, ou ativar o processamento de digitalização / anotação componente.
  • apropriado para grãos fornecidos com uma biblioteca, onde não queremos que o aplicativo usando esta biblioteca para preocupar-se com o ciclo de vida do bean.

Contras:

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

Use JSR-250 @ PostConstruct lifecyle anotação

Pros:

  • Útil ao usar a digitalização componente para feijão Autodetectar.
  • deixa claro que um método específico é para ser usado para inicialização. Intenção é mais perto do código.

Contras:

  • A inicialização especificado não está mais central na configuração.
  • Você deve se lembrar de ligar o processamento de anotação (que pode às vezes ser esquecido)

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

A desvantagem é que o feijão se torna Primavera-aware, mas na maioria das aplicações que não é tão ruim.

Você pode implantar um costume BeanPostProcessor em seu contexto de aplicação de fazê-lo. Ou se você não se importa implementar uma interface Primavera em seu bean, você poderia usar o InitializingBean interface ou o "-método init" directiva (mesmo link).

Para limpar ainda mais qualquer confusão sobre os dois abordagem uso ou seja de

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

A partir da experiência pessoal, eu percebi que usando (1) só funciona em um contêiner de servlet, enquanto (2) funciona em qualquer ambiente, mesmo em aplicações desktop. Então, se você estaria usando Primavera em um aplicativo independente, você teria que usar (2) para realizar que "chamar esse método após a inicialização.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top