Lifecycle接口定義了每個對象的重要方法,每個對象都有自己的生命周期需求,如下:
public interface Lifecycle { void start(); void stop(); boolean isRunning(); }
任何spring管理的對象都可以實現這個接口。那么,當ApplicationContext自身啟動和停止時,它將自動調用上下文內所有生命周期的實現。通過委托給LifecycleProcessor
來做這個工作。
注意LifecycleProcessor
自身擴展了Lifecycle接口。它也增加了兩個其他的方法來與上下文交互,使得可以刷新和關閉。
public interface LifecycleProcessor extends Lifecycle { void onRefresh(); void onClose(); }
啟動和關閉調用的順序是很重要的。如果兩個對象之間存在依賴關系,依賴類要在其依賴類后啟動,依賴類也要在其依賴類前停止。然而有時候其之間的依賴關系不是那么直接。你可能僅僅知道某種類型的對象應該在另一類型對象前啟動。在那些情況下,SmartLifecycle接口定義了另一個選項,在其父類接口Phased中定義命名為getPhase()方法。
public interface Phased { int getPhase(); } public interface SmartLifecycle extends Lifecycle, Phased { boolean isAutoStartup(); void stop(Runnable callback); }
當啟動時,有最低phase的對象首先啟動,並且停止時,按照相反的順序結束。因此,實現了SmartLifecycle
接口並且其
getPhase()方法返回Integer.MIN_VALUE
的一個對象將是首先被啟動並且最后停止。與其相反對應的對象,Integer.MAX_VALUE的phase的值,將指明最后啟動和最先停止(可能是其依賴其他對象工作運行)。當考慮phase值時,了解任何普通Lifecycle對象(沒有實現SmartLifecycle其值將是0)的默認phase也很重要。因此,任何負數phase值將表示對象應該在那些標准組件前啟動(並其之后停止),並且對於正數的phase值按照相反順序啟動停止。
如你在SmartLifecycle接口中定義的stop方法內有一回調參數。任何實現類在其關閉完成后必須調用回調的run方法。必須的時候由於實現了LifecycleProcessor接口的實現類可以進行異步關閉操作,DefaultLifecycleProcessor對於在每個phase調用那個回調內的對象組將等待一個超時時間。默認的每個phase的超時是30秒。你可以通過在上下文內定義一個命名為
lifecycleProcessor的bean重寫默認的生命周期處理器實例。如果你僅僅想修改超時時間,如下定義將會很有用:
<bean id="lifecycleProcessor"class="org.springframework.context.support.DefaultLifecycleProcessor"> <!-- timeout value in milliseconds --> <property name="timeoutPerShutdownPhase" value="10000"/> </bean>
LifecycleProcessor
接口定義了回調方法來刷新和關閉上下文。后者僅簡單地做關閉處理如同直接地調用stop方法,但是當關閉上下文時,這將起作用。刷新回調使得SmartLifecycle bean的另一個功能起作用。當上下文刷新時(在所有的對象實例化和初始化后),將調用那個回調,並且在那個點上,默認的生命周期處理器將檢查每個SmartLifecycle對象的isAutoStartup()方法的返回值。如果是true,那么對象將在那個點上啟動而不是等一個上下文的明確調用或者等其自己的start()方法(不像上下文的刷新,上下文啟動對於標准的上下文實現不是自動發生的)phase值與依賴關系一樣將如上所述決定了啟動順序。