188 votes

Exécution de la méthode au démarrage dans Spring

Existe-t-il une fonctionnalité de Spring 3 permettant d'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 et elle s'exécute juste après le démarrage, mais ensuite elle s'exécutera périodiquement.

2 votes

Quel est le truc avec @Scheduled ? c'est exactement ce que je veux !

9voto

KAARTHIKEYAN Points 81

Avec SpringBoot, nous pouvons exécuter une méthode au démarrage via @EventListener annotation

@Component
public class LoadDataOnStartUp
{   
    @EventListener(ApplicationReadyEvent.class)
    public void loadData()
    {
        // do something
    }
}

7voto

Wim Deblauwe Points 2570

Ce que nous avons fait, c'est étendre org.springframework.web.context.ContextLoaderListener pour imprimer quelque chose quand le contexte commence.

public class ContextLoaderListener extends org.springframework.web.context.ContextLoaderListener
{
    private static final Logger logger = LoggerFactory.getLogger( ContextLoaderListener.class );

    public ContextLoaderListener()
    {
        logger.info( "Starting application..." );
    }
}

Configurez ensuite la sous-classe dans web.xml :

<listener>
    <listener-class>
        com.mycomp.myapp.web.context.ContextLoaderListener
    </listener-class>
</listener>

4voto

Joram Points 391

Attention, ceci n'est conseillé que si votre runOnceOnStartup dépend d'un contexte Spring entièrement initialisé. Par exemple : vous voulez appeler un dao avec une démarcation de transaction

Vous pouvez également utiliser une méthode planifiée avec un fixedDelay fixé très haut

@Scheduled(fixedDelay = Long.MAX_VALUE)
public void runOnceOnStartup() {
    dosomething();
}

Cela présente l'avantage de câbler l'ensemble de l'application (Transactions, Dao, ...).

vu dans Planification de tâches à exécuter une fois, en utilisant l'espace de noms des tâches de Spring.

0 votes

Je ne vois pas d'avantage à utiliser @PostConstruct ?

0 votes

@WimDeblauwe dépend de ce que vous voulez faire dans dosomething() l'appel d'un dao Autowired avec démarcation Trasaction nécessite le démarrage de tout le contexte, pas seulement de ce bean.

5 votes

@WimDeblauwe La méthode '@PostConstruct' se déclenche lorsque le bean est initialisé, le contexte entier peut ne pas être prêt (gestion des transactions).

1voto

user469718 Points 35

J'ai posté une autre solution qui implémente WebApplicationInitializer et qui est appelée bien avant l'instanciation de n'importe quel bean de Spring, au cas où quelqu'un aurait ce cas d'utilisation.

Initialiser le Locale et le Timezone par défaut avec la configuration de Spring

1voto

dnocode Points 81
AppStartListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof ApplicationReadyEvent){
            System.out.print("ciao");

        }
    }
}

3 votes

ApplicationReadyEvent est dans spring boot pas dans spring 3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X