## 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通知也不一定保證會觸發的。