Estou convertendo um controlador para a versão de anotação mais recente. Na versão anterior, eu costumava especificar o método init em springmvc-servlet.xml usando:
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
Como posso especificar o método init usando a versão de anotação?
java
spring
annotations
controller
Krt_Malta
fonte
fonte
Respostas:
Você pode usar
fonte
Alternativamente, você pode fazer com que sua classe implemente a
InitializingBean
interface para fornecer uma função de retorno de chamada (afterPropertiesSet()
) que o ApplicationContext invocará quando o bean for construído.fonte
Existem várias maneiras de interceptar o processo de inicialização no Spring. Se você tiver que inicializar todos os beans e autowire / injetá-los, há pelo menos duas maneiras que conheço que garantirão isso. Eu testei apenas o segundo, mas acredito que ambos funcionam da mesma forma.
Se você estiver usando @Bean, você pode fazer referência por initMethod, como este.
Se estiver usando @Component, você pode anotar com @EventListener assim.
No meu caso, tenho um sistema legado onde agora estou usando IoC / DI, onde Spring Boot é a estrutura escolhida. O sistema antigo traz muitas dependências circulares para a tabela e, portanto, devo usar muito a dependência de setter. Isso me deu algumas dores de cabeça, já que não podia confiar em @PostConstruct, já que o autowiring / injeção por setter ainda não estava feito. O pedido é construtor, @PostConstruct e configuradores autowired. Resolvi isso com a anotação @EventListener que será executada por último e "ao mesmo" tempo para todos os beans. O exemplo mostra a implementação de InitializingBean também.
Eu tenho duas classes (@Component) com dependência uma da outra. As classes parecem iguais para o propósito deste exemplo, exibindo apenas uma delas.
Esta é a saída do log que mostra a ordem das chamadas quando o contêiner é iniciado.
Como você pode ver, @EventListener é executado por último depois que tudo estiver pronto e configurado.
fonte
fonte