Eu tenho um caso de uso em que preciso chamar um método (não estático) no bean apenas uma vez no carregamento do ApplicationContext. Tudo bem, se eu usar MethodInvokingFactoryBean para isso? Ou temos uma solução melhor?
Como uma observação lateral, eu uso o ConfigContextLoaderListener para carregar o Contexto do Aplicativo no aplicativo Web. E quer, se o bean 'A' for instanciado, chame methodA () uma vez.
Como isso pode ser bem feito?
Para expandir a sugestão @PostConstruct em outras respostas, essa é realmente a melhor solução, na minha opinião.
fonte
<context:component-scan>
também funciona e pode ser útil para reduzir o tempo de inicialização, se você tiver grandes bibliotecas não Spring no caminho de classe.Existem três abordagens diferentes a serem consideradas, conforme descrito na referência
Use o atributo init-method
Prós:
Contras:
Implementar InitializingBean
Prós:
Contras:
Use a anotação do estilo de vida JSR-250 @PostConstruct
Prós:
Contras:
fonte
@PostConstruct
lo precisamente porque faz parte da classe que ele precisa do método que chama no final do processamento de inicialização.Você já tentou implementar
InitializingBean
? Parece exatamente o que você procura.A desvantagem é que seu bean torna-se compatível com o Spring, mas na maioria dos aplicativos isso não é tão ruim.
fonte
Você pode implantar um BeanPostProcessor personalizado no contexto do aplicativo para fazê-lo. Ou, se você não se importa em implementar uma interface Spring no seu bean, pode usar a interface InitializingBean ou a diretiva "init-method" (mesmo link).
fonte
Para esclarecer ainda mais qualquer confusão sobre as duas abordagens, ou seja, o uso de
@PostConstruct
einit-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. Portanto, se você usasse o Spring em um aplicativo independente, teria que usar (2) para realizar isso ", chame esse método após a inicialização.
fonte
@PostConstruct
(quando usado em um aplicativo baseado no Spring) está vinculado à vida útil do contexto do Spring. Tais contextos podem ser usados em todos os tipos de aplicativos.