Я не могу заставить работать реализацию жизненного цикла Spring - PullRequest
13 голосов
/ 07 июня 2011

Мне нужно, чтобы что-то произошло сразу после загрузки контекста приложения Spring.Насколько я понимаю, мне нужно создать реализацию жизненного цикла и поместить ссылку на компонент в контекст.Итак, у меня есть что-то вроде этого в моем контексте:

<bean id="mySpringLifecycle" class="com.my.project.MySpringLifecycle" />

Класс выглядит примерно так:

public class MySpringLifecycle implements Lifecycle {

    @Override
    public void start() {
        System.out.println("The lifecycle has started.");
    }

    @Override
    public void stop() {
        return;
    }

    @Override
    public boolean isRunning() {
        return true;
    }
}

Я не получаю ошибок, но MySpringLifecycle никогда не печатает "Жизненный цикл запущен. ", и мое приложение запускается просто отлично.

РЕДАКТИРОВАТЬ:

Это фиксированный код:

public class MySpringLifecycle implements SmartLifecycle {

    private volatile boolean isRunning = false;

    @Override
    public boolean isAutoStartup() {
        return true;
    }

    @Override
    public void stop(Runnable r) {
        System.out.println("STOPPED RUNNABLE!!!");
        isRunning = false;
    }

    @Override
    public void start() {
        System.out.println("STARTED!!!");
        isRunning = true;
    }

    @Override
    public void stop() {
        System.out.println("STOPPED!!!");
        isRunning = false;
    }

    @Override
    public boolean isRunning() {
        return isRunning;
    }

    @Override
    public int getPhase() {
        return 1;
    }
}

Как примечание яТакже хотел бы упомянуть альтернативное решение, которое я также могу использовать.В моем файле web.xml есть следующее:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

В ContextLoaderListener есть метод contextInitialized.Поэтому я создал собственную реализацию и добавил ее в web.xml.В моей реализации я расширил ContextLoaderListener, предоставил переопределение для метода contextInitialized, сначала вызвал super для этого метода, а затем выполнил свою собственную функциональность.Это выполняется только один раз и, кажется, работает хорошо.

Ответы [ 4 ]

9 голосов
/ 07 июня 2011

Два способа сделать это:

  1. Реализуйте SmartLifecycle вместо Lifecycle и обязательно верните true из isAutoStartup().

  2. Реализация ApplicationListener<ContextRefreshedEvent>. В этом случае есть только один метод для реализации вместо 6 для SmartLifecycle.

1 голос
/ 07 июня 2011

Если вы измените MySpringLifecycle для реализации SmartLifecycle вместо Жизненный цикл , System.outs в вашем фрагменте будет напечатан так, как вы ожидаете.

0 голосов
/ 07 июня 2011

В зависимости от того, что вы подразумеваете под «сразу после загрузки контекста приложения Spring.», Реализация InitializingBean может быть тем, что вы ищете. LifeCycle может быть слишком низкого уровня.

0 голосов
/ 07 июня 2011

Я не уверен, но вам может понадобится LifecycleProcessor в дополнение к одному или нескольким Lifecycle объектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...