之前有朋友問題這樣的一個問題
springboot通過main方法是如何啓動web系統的,它是如何識別當前系統是不是web項目呢。
今天突然想起來了,翻看了下springboot的代碼,在此坐下記錄
springboot通過SpringApplication的run方法作爲入口啓動。
系統啓動的時候我們傳入的是一個source的object對象。一般是傳入springboot在我們系統的啓動類
在內部實例化了一個SpringApplication對象並且初始化
在初始化過程中檢查當前系統是否是web系統代碼如下
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
this.webEnvironment = deduceWebEnvironment();
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
private boolean deduceWebEnvironment() {
for (String className : WEB_ENVIRONMENT_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return false;
}
}
return true;
}
private static final String[] WEB_ENVIRONMENT_CLASSES = { "javax.servlet.Servlet",
"org.springframework.web.context.ConfigurableWebApplicationContext" };
通過以上代碼我們可以看到,系統檢查是不是存在以上兩個接口的實例化對象以推斷當前系統是不是web項目