1毕荐、創(chuàng)建SpringApplication對象
initialize(sources);
private void initialize(Object[] sources) {
//保存主配置類
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
//判斷當(dāng)前是否一個web應(yīng)用
this.webEnvironment = deduceWebEnvironment();
//從類路徑下找到META-INF/spring.factories配置的所有ApplicationContextInitializer水评;然后保存起來
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
//從類路徑下找到ETA-INF/spring.factories配置的所有ApplicationListener
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//從多個配置類中找到有main方法的主配置類
this.mainApplicationClass = deduceMainApplicationClass();
}
2浑玛、運(yùn)行run()方法
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
//獲取SpringApplicationRunListeners;從類路徑下META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//回調(diào)所有的獲取SpringApplicationRunListener.starting()方法
listeners.starting();
try {
//封裝命令行參數(shù)
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//準(zhǔn)備環(huán)境
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
//創(chuàng)建環(huán)境完成后回調(diào)SpringApplicationRunListener.environmentPrepared()拒名;表示環(huán)境準(zhǔn)備完成
Banner printedBanner = printBanner(environment);
//創(chuàng)建ApplicationContext吩愧;決定創(chuàng)建web的ioc還是普通的ioc
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
//準(zhǔn)備上下文環(huán)境;將environment保存到ioc中;而且applyInitializers()增显;
//applyInitializers():回調(diào)之前保存的所有的ApplicationContextInitializer的initialize方法
//回調(diào)所有的SpringApplicationRunListener的contextPrepared()雁佳;
//
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//prepareContext運(yùn)行完成以后回調(diào)所有的SpringApplicationRunListener的contextLoaded();
//s刷新容器同云;ioc容器初始化(如果是web應(yīng)用還會創(chuàng)建嵌入式的Tomcat)糖权;Spring注解版
//掃描,創(chuàng)建梢杭,加載所有組件的地方温兼;(配置類,組件武契,自動配置)
refreshContext(context);
//從ioc容器中獲取所有的ApplicationRunner和CommandLineRunner進(jìn)行回調(diào)
//ApplicationRunner先回調(diào)募判,CommandLineRunner再回調(diào)
afterRefresh(context, applicationArguments);
//所有的SpringApplicationRunListener回調(diào)finished方法
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//整個SpringBoot應(yīng)用啟動完成以后返回啟動的ioc容器;
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}
3咒唆、事件監(jiān)聽機(jī)制
public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {
//必須有的構(gòu)造器
public HelloSpringApplicationRunListener(SpringApplication application, String[] args){
}
@Override
public void starting() {
System.out.println("SpringApplicationRunListener...starting...");
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
Object o = environment.getSystemProperties().get("os.name");
System.out.println("SpringApplicationRunListener...environmentPrepared.."+o);
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
System.out.println("SpringApplicationRunListener...contextPrepared...");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
System.out.println("SpringApplicationRunListener...contextLoaded...");
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
System.out.println("SpringApplicationRunListener...finished...");
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者