🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 1.实现Lifecycle 接口 ~~~ import org.springframework.context.Lifecycle; public class MyLifeCycle implements Lifecycle { /** * 运行状态 */ private volatile boolean running = false; /** * 容器启动后调用 */ @Override public void start() { System.out.println("容器启动后执行MyLifeCycle操作..."); running = true; } /** * 容器停止时调用 */ @Override public void stop() { System.out.println("收到关闭容器的信号MyLifeCycle操作..."); running = false; } /** * 检查此组件是否正在运行。 * 1. 只有该方法返回false时,start方法才会被执行。 * 2. 只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。 */ @Override public boolean isRunning() { System.out.println("检查MyLifeCycle组件的运行状态:" + running); return running; } } ~~~ ## 2. 配置spring.xml ~~~ <bean id="myLifeCycle" class="com.example.demo.MyLifeCycle" /> ~~~ ## 3.测试 ~~~ public static void main(String[] args) { ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("spring.xml"); System.out.println("===================="); context.start(); System.out.println("==============================="); context.stop(); // 输出 // ==================== //检查MyLifeCycle组件的运行状态:false //容器启动后执行MyLifeCycle操作... //=============================== //检查MyLifeCycle组件的运行状态:true //收到关闭容器的信号MyLifeCycle操作... } ~~~ ## 4.总结 1.当 ApplicationContext 执行 start 时,spring默认会调用 ***LifecycleProcessor***的start 方法 ,LifecycleProcessor 的默认实现DefaultLifecycleProcessor 会调用start -> doStart 方法,执行自定义的 Lifecycle 的start方法 2.当 ApplicationContext 执行 stop 时 ,DefaultLifecycleProcessor 会调用 stop->stopBeans 方法执行自定义的 Lifecycle 的stop方法 3..Lifecycle接口是显式启动和停止通知的纯契约,并不意味着在上下文刷新时自动启动。为了对特定bean的自动启动进行细粒度控制(包括启动阶段),可以考虑改用实现org.springframework.context.[SmartLifeCycle](%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E7%8E%B0SmartLifeCycle%E6%8E%A5%E5%8F%A3.md)。(官方说的) 4.我的理解:LifeCycle只会感知容器开始和启动生命周期,在自动start 的容器刷新时期时不会被调用的。 同时stop通知也不一定保证会触发的。