spring事件(二)--定义由spring管理生命周期的bean

本文介绍了如何在Spring开发中创建具有与Spring容器相同生命周期的bean。通过实现Lifecycle接口,当容器调用start()和stop()时,bean也能响应相应操作。文章详细讲解了Lifecycle接口的start(), stop()和isRunning()方法,并给出了一个自定义实现Lifecycle接口的bean示例。" 111904877,10535343,React渲染后滚动到顶部的解决方案,"['React', '前端开发', 'JavaScript']
摘要由CSDN通过智能技术生成

一、简介

在spring开发中,有时我们需要定义和spring容器一样生命周期的bean,

即是当springp容器调用start()方法、或者stop方法时,自定义的bean也会做相应的处理。

达到此目的需要实现接口org.springframework.context.Lifecycle

二、Lifecycle接口

Lifecycle接口用于,当spring容器调用start()或stop()方法时,实现其接口的类也会调用相应的方法。

Lifecycle接口有三个方法:

start():开始时调用的方法

stop():停止时调用的方法

isRunning():判断当前bean是处于start状态还是stop状态

其源码如下:

/**
 * A common interface defining methods for start/stop lifecycle control.
 * The typical use case for this is to control asynchronous processing.
 * <b>NOTE: This interface does not imply specific auto-startup semantics.
 * Consider implementing {@link SmartLifecycle} for that purpose.</b>
 *
 * <p>Can be implemented by both components (typically a Spring bean defined in a
 * Spring context) and containers  (typically a Spring {@link ApplicationContext}
 * itself). Containers will propagate start/stop signals to all components that
 * apply within each container, e.g. for a stop/restart scenario at runtime.
 *
 * <p>Can be used for direct invocations or for management operations via JMX.
 * In the latter case, the {@link org.springframework.jmx.export.MBeanExporter}
 * will typically be defined with an
 * {@link org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler},
 * restricting the visibility of activity-controlled components to the Lifecycle
 * interface.
 *
 * <p>Note that the Lifecycle interface is only supported on <b>top-level singleton
 * beans</b>. On any other component, the Lifecycle interface will remain undetected
 * and hence ignored. Also, note that the extended {@link SmartLifecycle} interface
 * provides integration with the application context's startup and shutdown phases.
 *
 * @author Juergen Hoeller
 * @since 2.0
 * @see SmartLifecycle
 * @see ConfigurableApplicationContext
 * @see org.springframework.jms.listener.AbstractMessageListenerContainer
 * @see org.springframework.scheduling.quartz.SchedulerFactoryBean
 */
public interface Lifecycle {

   /**
    * Start this component.
    * <p>Should not throw an exception if the component is already running.
    * <p>In the case of a container, this will propagate the start signal to all
    * components that apply.
    * @see SmartLifecycle#isAutoStartup()
    */
   void start();

   /**
    * Stop this component, typically in a synchronous fashion, such that the component is
    * fully stopped upon return of this method. Consider implementing {@link SmartLifecycle}
    * and its {@code stop(Runnable)} variant when asynchronous stop behavior is necessary.
    * <p>Note that this stop notification is not guaranteed to come before destruction: On
    * regular shutdown, {@code Lifecycle} beans will first receive a stop notification before
    * the general destruction callbacks are being propagated; however, on hot refresh during a
    * context's lifetime or on aborted refresh attempts, only destroy methods will be called.
    * <p>Should not throw an exception if the component isn't started yet.
    * <p>In the case of a container, this will propagate the stop signal to all components
    * that apply.
    * @see SmartLifecycle#stop(Runnable)
    * @see org.springframework.beans.factory.DisposableBean#destroy()
    */
   void stop();

   /**
    * Check whether this component is currently running.
    * <p>In the case of a container, this will return {@code true} only if <i>all</i>
    * components that apply are currently running.
    * @return whether the component is currently running
    */
   boolean isRunning();

}
三、代码实例

1、自定义实现Lifecycle接口的带生命周期的bean

@Component
public class StuLifecycle implements Lifecycle {
    private boolean running = false;
    public void start() {
        System.out.println("stu start");
        running =true;
    }

    public void stop() {
        System.out.println("stu stop");
        running = false;
    }

    public boolean isRunning() {
        return running;
    }
}
2、测试

public class SpringSelfEventMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        ctx.start();  //ContextStartedEvent事件发生
        ctx.stop();   //ContextStoppedEvent事件发生
        ctx.close();  //ContextClosedEvent事件发生
    }
}
运行结果:

stu start
stu stop



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值