Existe-t-il une fonctionnalité Spring 3 pour exécuter certaines méthodes lorsque l'application démarre pour la première fois? Je sais que je peux faire l'astuce de définir une méthode avec @Scheduled
annotation et qu'elle s'exécute juste après le démarrage, mais ensuite elle s'exécutera périodiquement.
176
Réponses:
Si par "démarrage de l'application" vous entendez "démarrage du contexte de l'application", alors oui, il existe de nombreuses façons de le faire , la plus simple (pour les beans singletons, en tout cas) étant d'annoter votre méthode avec
@PostConstruct
. Jetez un œil au lien pour voir les autres options, mais en résumé, ce sont:@PostConstruct
afterPropertiesSet()
comme défini par l'InitializingBean
interface de rappelTechniquement, ce sont des crochets dans le cycle de vie du bean , plutôt que dans le cycle de vie du contexte, mais dans 99% des cas, les deux sont équivalents.
Si vous avez besoin de vous connecter spécifiquement au démarrage / arrêt du contexte, vous pouvez implémenter l'
Lifecycle
interface à la place, mais ce n'est probablement pas nécessaire.la source
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éthode a été appelée, mais l'infrastructure JMS dont il dépendait indirectement n'était pas encore complètement câblée (et étant Spring, tout a échoué en silence). Lors du passage à@EventListener(ApplicationReadyEvent.class)
tout fonctionnait (ApplicationReadyEvent
Spring Boot est-il spécifique à vanilla Spring, voir la réponse de Stefan).Cela se fait facilement avec un fichier
ApplicationListener
. J'ai fait travailler ça en écoutant SpringContextRefreshedEvent
:Les écouteurs d'applications s'exécutent de manière synchrone dans Spring. Si vous voulez vous assurer que votre code n'est exécuté qu'une seule fois, gardez simplement un état dans votre composant.
METTRE À JOUR
À partir de Spring 4.2+, vous pouvez également utiliser l'
@EventListener
annotation pour observer leContextRefreshedEvent
(merci à @bphilipnyc pour l'avoir signalé):la source
ContextStartedEvent
place, il est plus difficile d'ajouter l'auditeur avant le déclenchement de l'événement.Dans Spring 4.2+, vous pouvez maintenant simplement faire:
la source
Si vous utilisez des bottes à ressort, c'est la meilleure réponse.
Je pense que cela
@PostConstruct
et d'autres interjections du cycle de vie sont des voies rondes. Celles-ci peuvent conduire directement à des problèmes d'exécution ou provoquer des défauts moins qu'évidents dus à des événements de cycle de vie bean / contexte inattendus. Pourquoi ne pas simplement appeler directement votre bean en utilisant Java brut? Vous invoquez toujours le bean de la «manière du ressort» (par exemple: via le proxy Spring AoP). Et le meilleur de tous, c'est du java simple, ne peut pas être plus simple que cela. Pas besoin d'écouteurs de contexte ou de programmateurs étranges.la source
main()
du tout, par exemple lors de l'utilisation d'un framework d'application (par exemple JavaServer Faces).Pour les utilisateurs de Java 1.8 qui reçoivent un avertissement lorsqu'ils essaient de référencer l'annotation @PostConstruct, j'ai fini par utiliser l'annotation @Scheduled, ce que vous pouvez faire si vous avez déjà un travail @Scheduled avec fixedRate ou fixedDelay.
la source
Ce que nous avons fait a été d'étendre
org.springframework.web.context.ContextLoaderListener
pour imprimer quelque chose lorsque le contexte démarre.Configurez ensuite la sous-classe dans
web.xml
:la source
Avec SpringBoot, nous pouvons exécuter une méthode au démarrage via une
@EventListener
annotationla source
Vous pouvez également utiliser une méthode planifiée avec un paramètre fixedDelay très élevé
Cela présente l'avantage que toute l'application est câblée (Transactions, Dao, ...)
vu dans Planification des tâches à exécuter une fois, à l'aide de l'espace de noms de tâches Spring
la source
@PostConstruct
?Publication d'une autre solution qui implémente WebApplicationInitializer et qui est appelée bien avant qu'un bean spring ne soit instancié, au cas où quelqu'un aurait ce cas d'utilisation
Initialiser les paramètres régionaux et le fuseau horaire par défaut avec la configuration Spring
la source
la source
Si vous souhaitez configurer un bean avant que votre application ne s'exécute complètement, vous pouvez utiliser
@Autowired
:la source
Vous pouvez utiliser
@EventListener
sur votre composant, qui sera appelé après le démarrage du serveur et l'initialisation de tous les beans.la source
Pour un fichier
StartupHousekeeper.java
situé dans le packagecom.app.startup
,Faites ceci dans
StartupHousekeeper.java
:Et faites-le en
myDispatcher-servlet.java
:la source