## 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通知也不一定保证会触发的。