2
bean的初始化/清除有多種不同的方式可以完成。還有其他事件機制。除了所有這些,爲什麼Spring有啓動上下文的概念,我認爲這個概念調用了bean的相應啓動和停止方法。爲什麼在春季啓動和停止bean的概念
爲了驗證這一點,我有一段代碼,看起來像這樣 -
public class Car implements InitializingBean, DisposableBean, SmartLifecycle {
private Engine engine;
private volatile boolean isRunning = false;
@Override
public void afterPropertiesSet() throws Exception {
logger.debug("Car -- afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
logger.debug("Car -- destroy");
}
@PostConstruct
public void postConstruction() {
logger.debug("Car -- postConstruct");
}
@PreDestroy
public void preDestruction() {
logger.debug("Car -- preDestroy");
}
@Override
public void stop() {
//Note that this stop notification is not guaranteed to come before destruction: On regular shutdown,
//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.
logger.debug("Car -- stop");
isRunning = false;
}
@Override
public boolean isRunning() {
//Check whether this component is currently running.
//In the case of a container, this will return true only if all components that apply are currently running.
logger.debug("Car -- isRunning");
return isRunning;
}
@Override
public int getPhase() {
//Return the phase value of this object.
logger.debug("Car -- getPhase");
return 10;
}
@Override
public boolean isAutoStartup() {
//Returns true if this Lifecycle component should get started automatically by the container
//A value of false indicates that the component is intended to be started through an explicit start() call instead,
//analogous to a automatic Lifecycle.
logger.debug("Car -- isAutoStartup");
return false;
}
@Override
public void stop(Runnable callback) {
logger.debug("Car -- stop - async");
isRunning = false;
try {
//Sleeping for 10 seconds so that all threads
//get enough time to do their cleanup
TimeUnit.SECONDS.sleep(10);
logger.debug("Wait over");
//Shudown complete. Regular shutdown will continue.
callback.run();
} catch (final InterruptedException e) {
//Looks like we got exception while shutting down,
//log it or do something with it
}
}
@Override
public void start() {
//Start this component.
//Should not throw an exception if the component is already running.
logger.debug("Car -- start");
isRunning = true;
}
}
首先,我對isAutoStartUp返回真值那麼我嘗試返回false。下面的圖片是2次運行的日誌文件的比較。 無論autostartup是true/false,代碼運行良好。
*該代碼可以正常運行,但是一些更復雜的bean可能需要在這些生命週期回調中執行某些操作,並且如果嘗試在啓動之前嘗試使用它們,可能無法正常工作(並且可能會留下泄漏的資源在沒有機會整齊關閉的情況下被移除)。 – Thilo
所以問題是我們在這些方法中做了什麼 - 關於什麼地方的最佳實踐? – John