public static void main(string args)
return run(new class<?> , args);
}}
spring boot主程式main方法只做了兩件事
this(null, primarysources);
} //resourceloader = null
this.resourceloader = resourceloader;
assert.notnull(primarysources, "primarysources must not be null");
this.primarysources = new linkedhashset<>(arrays.aslist(primarysources));
/*** 該方法主要呼叫以下方法進行判斷
* classutils.ispresent(string classname, @nullable classloader classloader)
* classname 全類名
* classloader 類載入器
* 判斷能否從classloader(類載入器)中獲取與classname(全類名)相對應的class類
* (方法內部判斷不止乙個判斷,但大致是這個意思,有興趣可以自己研究)
*//**
* 呼叫了兩個方法
* 這個方法很重要,在下面有單獨說明,看完再繼續
* * 2. setinitializers
* 為this.initializers初始化並賦值
*//**
* 和上面方法是一樣的
*//**
* 儲存main(spring boot主程式)所在類的class物件
*/}
1. getspringfactoriesinstances
private collectiongetspringfactoriesinstances(classtype) );
}private collectiongetspringfactoriesinstances(classtype, class<?> parametertypes, object... args)
2. loadfactorynames
public static listloadfactorynames(class<?> factoryclass, @nullable classloader classloader)
private static map> loadspringfactories(@nullable classloader classloader) else }}
/*** 所有meta-inf/spring.factories配置檔案下的資料都被儲存起來
*/cache.put(classloader, result);
/*** 返回獲取到的linkedmultivaluemap資料(就是資料集,內部封裝了map,value值是list集合)
* * 總結:
* 這個方法就是使用類載入器獲取所有meta-inf/spring.factories檔案位址,並把所有檔案以key-value的形式進行解析
* 最後儲存解析出來的資料並返回
*/return result;
} catch (ioexception var13)
}}
stopwatch stopwatch = new stopwatch();
stopwatch.start();
collectionexceptionreporters = new arraylist<>();
configureheadlessproperty();
/*** getspringfactoriesinstances上面說過,跳過
*//**
* 使listeners物件變數this.listeners中的每個物件呼叫starting()方法(就是啟動並初始化物件)
*/listeners.starting();
try
/***/
listeners.started(context);
/***/
}catch (throwable ex)
try
catch (throwable ex)
return context;}
1. preparecontext
/*** 為ioc容器設定環境
*/context.setenvironment(environment);
/*** ioc容器後置處理,根據需要設定其它處理
*//**
*//**
*/listeners.contextprepared(context);
/*** 日誌記錄相關設定
*/if (this.logstartupinfo)
/*** 獲取bean工廠並根據條件新增元件
*/configurablelistablebeanfactory beanfactory = context.getbeanfactory();
if (printedbanner != null)
if (beanfactory instanceof defaultlistablebeanfactory)
setsources = getallsources();
assert.notempty(sources, "sources must not be empty");
/*** 將bean載入到應用程式上下文中
*/load(context, sources.toarray(new object[0]));
/***/
listeners.contextloaded(context);}
springboot專案啟動自動執行
order value 1 專案啟動執行方法的順序,從小到大 component override system.out.println start 帶有此註解的類在專案啟動時會自動註冊在spring容器 service public class redislockinit 被 postconstr...
springboot啟動後執行某些命令
多個類實現介面可以使用 order註解來定義執行順序 專案啟動完成了,因此可以注入spring管理的類 例項 component order 1 autowired private stringredistemplate stringredistemplate override stringredi...
spring boot, 容器啟動後執行某操作
常有在spring容器啟動後執行某些操作的需求,現做了乙個demo的實現,做一下記錄,也希望可以給需要的同學提供參考。1.spring啟動後,以新執行緒執行後續需要的操作,所以執行類實現runnable介面 component public class stepexecutor implements...