Подтвердить что ты не робот

Кажется, я не могу реализовать реализацию Spring Lifecycle

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

<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 никогда не выводит "Начало жизненного цикла", и мое приложение начинается просто отлично.

EDIT:

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

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 для этого метода, и затем выполнил мою собственную функциональность. Это выполняется только один раз и, похоже, работает хорошо.

4b9b3361

Ответ 1

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

  • Внесите SmartLifecycle вместо Lifecycle и верните true из isAutoStartup().

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

Ответ 2

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

Ответ 4

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