Existe algum recurso do Spring 3 para executar alguns métodos quando o aplicativo é iniciado pela primeira vez? Eu sei que posso @Scheduled
executar o truque de definir um método com anotação e ele é executado logo após a inicialização, mas será executado periodicamente.
176
Respostas:
Se por "inicialização do aplicativo" você quer dizer "inicialização do contexto do aplicativo", sim, existem muitas maneiras de fazer isso , sendo a mais fácil (para os feijões singletons, de qualquer maneira) anotar seu método
@PostConstruct
. Dê uma olhada no link para ver as outras opções, mas em resumo elas são:@PostConstruct
afterPropertiesSet()
conforme definido pelaInitializingBean
interface de retorno de chamadaTecnicamente, esses são ganchos no ciclo de vida do bean , em vez do ciclo de vida do contexto, mas em 99% dos casos, os dois são equivalentes.
Se você precisar se conectar especificamente ao contexto de inicialização / desligamento, poderá implementar a
Lifecycle
interface , mas isso provavelmente é desnecessário.fonte
Access restriction: The type PostConstruct is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/rt.jar
@PostConstruct
método foi chamado, mas a infra-estrutura do JMS de que ele dependia indiretamente ainda não estava totalmente conectada (e sendo Spring, tudo falhou silenciosamente). Ao mudar para@EventListener(ApplicationReadyEvent.class)
tudo que funcionou (oApplicationReadyEvent
Spring Boot é específico para o vanilla Spring, consulte a resposta de Stefan).Isso é feito facilmente com um
ApplicationListener
. Eu fiz isso funcionar ouvindo SpringContextRefreshedEvent
:Ouvintes de aplicativos são executados de forma síncrona no Spring. Se você deseja garantir que seu código seja executado apenas uma vez, mantenha algum estado em seu componente.
ATUALIZAR
A partir do Spring 4.2+, você também pode usar a
@EventListener
anotação para observar oContextRefreshedEvent
(obrigado a @bphilipnyc por apontar isso):fonte
ContextStartedEvent
, é mais difícil adicionar o ouvinte antes que o evento seja disparado.No Spring 4.2+, agora você pode simplesmente fazer:
fonte
Se você estiver usando o boot de mola, esta é a melhor resposta.
Eu sinto que
@PostConstruct
e outras interjeições de vários ciclos de vida são alternativas. Isso pode levar diretamente a problemas de tempo de execução ou causar defeitos menos que óbvios devido a eventos inesperados do ciclo de vida do bean / contexto. Por que não invocar diretamente seu bean usando Java simples? Você ainda invoca o bean da 'maneira da primavera' (por exemplo: através do proxy AoP da primavera). E o melhor de tudo, é Java simples, não pode ser mais simples que isso. Não há necessidade de ouvintes de contexto ou agendadores ímpares.fonte
main()
, por exemplo, ao usar uma estrutura de aplicativo (por exemplo, JavaServer Faces).Para usuários do Java 1.8 que recebem um aviso ao tentar referenciar a anotação @PostConstruct, acabei pegando a anotação @Scheduled, que você pode fazer se já tiver um trabalho @Scheduled com fixedRate ou fixedDelay.
fonte
O que fizemos foi estender
org.springframework.web.context.ContextLoaderListener
para imprimir algo quando o contexto começar.Configure a subclasse e, em
web.xml
:fonte
Com o SpringBoot, podemos executar um método na inicialização via
@EventListener
anotaçãofonte
Você também pode usar um método agendado com FixedDelay definido muito alto
Isso tem a vantagem de que todo o aplicativo está conectado (Transações, Dao, ...)
visto em Planejando tarefas para serem executadas uma vez, usando o namespace da tarefa Spring
fonte
@PostConstruct
?Publicou outra solução que implementa o WebApplicationInitializer e é chamada muito antes de qualquer spring bean ser instanciado, caso alguém tenha esse caso de uso
Inicializar localidade e fuso horário padrão com a configuração do Spring
fonte
fonte
Se você deseja configurar um bean antes que seu aplicativo esteja sendo executado completamente, você pode usar
@Autowired
:fonte
Você pode usar
@EventListener
em seu componente, que será chamado após o servidor ser iniciado e todos os beans inicializados.fonte
Para um arquivo
StartupHousekeeper.java
localizado no pacotecom.app.startup
,Faça isso em
StartupHousekeeper.java
:E faça isso em
myDispatcher-servlet.java
:fonte