日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot 啟動方法run()源碼解析

瀏覽:199日期:2023-03-19 17:41:55
入口

通常一個簡單的SpringBoot基礎(chǔ)項目我們會有如下代碼

@SpringBootApplication@RestController@RequestMapping('/')public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

值得關(guān)注的有SpringApplication.run以及注解@SpringBootApplication

run方法

public ConfigurableApplicationContext run(String... args) { // 秒表StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();configureHeadlessProperty();// 獲取監(jiān)聽器SpringApplicationRunListeners listeners = getRunListeners(args);// 監(jiān)聽器啟動listeners.starting();try { // application 啟動參數(shù)列表ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 配置忽略的bean信息configureIgnoreBeanInfo(environment);Banner printedBanner = printBanner(environment);// 創(chuàng)建應(yīng)用上下文context = createApplicationContext();exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context); // 準(zhǔn)備上下文,裝配beanprepareContext(context, environment, listeners, applicationArguments, printedBanner);// 上下文刷新refreshContext(context);// 刷新后做什么afterRefresh(context, applicationArguments);stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}// 監(jiān)聽器開始了listeners.started(context);// 喚醒callRunners(context, applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, listeners);throw new IllegalStateException(ex);}try { // 監(jiān)聽器正式運行l(wèi)isteners.running(context);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, null);throw new IllegalStateException(ex);}return context;}getRunListeners

獲取監(jiān)聽器

private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };// 獲取 Spring Factory 實例對象return new SpringApplicationRunListeners(logger,getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args));}private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = getClassLoader();// Use names and ensure unique to protect against duplicates// 讀取 spring.factoriesSet<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));// 創(chuàng)建SpringFactory實例List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);/** * 排序 {@link Ordered} */AnnotationAwareOrderComparator.sort(instances);return instances;}

createSpringFactoriesInstances

@SuppressWarnings('unchecked') private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args, Set<String> names) { // 初始化 List<T> instances = new ArrayList<>(names.size()); for (String name : names) { try { // 通過名字創(chuàng)建類的class對象 Class<?> instanceClass = ClassUtils.forName(name, classLoader); Assert.isAssignable(type, instanceClass); // 構(gòu)造器獲取 Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes); // 創(chuàng)建具體實例 T instance = (T) BeanUtils.instantiateClass(constructor, args); // 加入實例表中 instances.add(instance); } catch (Throwable ex) { throw new IllegalArgumentException('Cannot instantiate ' + type + ' : ' + name, ex); } } return instances; }printBanner

private Banner printBanner(ConfigurableEnvironment environment) {if (this.bannerMode == Banner.Mode.OFF) {return null;}ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader: new DefaultResourceLoader(getClassLoader());// 創(chuàng)建打印器SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);if (this.bannerMode == Mode.LOG) { // 輸出return bannerPrinter.print(environment, this.mainApplicationClass, logger);} // 輸出return bannerPrinter.print(environment, this.mainApplicationClass, System.out);}Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {Banner banner = getBanner(environment);banner.printBanner(environment, sourceClass, out);return new PrintedBanner(banner, sourceClass);}

最終輸出內(nèi)容類:org.springframework.boot.SpringBootBanner

class SpringBootBanner implements Banner {private static final String[] BANNER = { '', ' . ____ _ __ _ _',' / / ___’_ __ _ _(_)_ __ __ _ ', '( ( )___ | ’_ | ’_| | ’_ / _` | ',' / ___)| |_)| | | | | || (_| | ) ) ) )', ' ’ |____| .__|_| |_|_| |___, | / / / /',' =========|_|==============|___/=/_/_/_/' };private static final String SPRING_BOOT = ' :: Spring Boot :: ';private static final int STRAP_LINE_SIZE = 42;@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream printStream) {for (String line : BANNER) {printStream.println(line);}String version = SpringBootVersion.getVersion();version = (version != null) ? ' (v' + version + ')' : '';StringBuilder padding = new StringBuilder();while (padding.length() < STRAP_LINE_SIZE - (version.length() + SPRING_BOOT.length())) {padding.append(' ');}printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT, AnsiColor.DEFAULT, padding.toString(),AnsiStyle.FAINT, version));printStream.println();}}

希望通過本篇對于springboot啟動方法的解讀,讓大家對springboot底層有了一個大致了解,只分析了主要方法,希望對大家有幫助

到此這篇關(guān)于SpringBoot 啟動方法run()源碼賞析的文章就介紹到這了,更多相關(guān)SpringBoot 啟動run()內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日精品一区二区三区| 免费人成黄页网站在线一区二区| 亚洲精品一二| 日韩精品久久理论片| 日韩一区中文| 精品国产一区二区三区噜噜噜| 国产成人久久| 高清精品久久| 1024精品一区二区三区| 国产婷婷精品| 97精品资源在线观看| 嫩草伊人久久精品少妇av杨幂| 高清不卡一区| 亚洲精品1区| 国产情侣久久| 91精品国产成人观看| 亚洲经典在线| 国产欧美日韩免费观看| 日韩免费高清| 天海翼亚洲一区二区三区| 欧美a在线观看| 亚洲一本视频| 久久国产视频网| 精品一区二区男人吃奶 | 欧美特黄a级高清免费大片a级| 性一交一乱一区二区洋洋av| 日韩国产高清在线| 国产精品国产一区| 在线视频亚洲| 国产精品毛片aⅴ一区二区三区| 亚洲综合电影| 日本亚洲欧洲无免费码在线| 精品72久久久久中文字幕| 久久久蜜桃一区二区人| 日韩在线黄色| 国产专区一区| 91国内精品| 99视频精品全国免费| 日韩国产一区二| 欧美日中文字幕| 欧美日韩亚洲一区在线观看| 亚洲a一区二区三区| 清纯唯美亚洲综合一区| 欧美日韩在线观看视频小说| 国产日韩中文在线中文字幕 | 欧美中文一区| 亚洲福利精品| 久久精品三级| 日韩毛片网站| www成人在线视频| 国产精品亲子伦av一区二区三区 | 午夜日韩福利| sm捆绑调教国产免费网站在线观看| 综合五月婷婷| 美女久久久久| 国产精品久久观看| 国产调教精品| 中文字幕日韩亚洲| 亚洲v在线看| 精品视频网站| 亚洲精品乱码久久久久久蜜桃麻豆| 日本精品影院| 精品国产午夜肉伦伦影院| 日韩高清在线不卡| 日韩在线播放一区二区| 日本不良网站在线观看| 欧美日本不卡| 亚洲精品极品| 香蕉精品999视频一区二区| 欧美一区久久久| 卡一卡二国产精品| 欧美日韩伊人| 日韩黄色av| 亚洲3区在线| 一区二区三区四区在线观看国产日韩 | 久久99偷拍| 日韩精选在线| 免费观看在线色综合| 国产精品毛片在线看| 日韩欧美一区免费| jizzjizz中国精品麻豆| 你懂的国产精品| 国产伦精品一区二区三区视频 | 麻豆精品久久久| 国产精品一区二区99| 亚洲一区二区小说| 亚洲丝袜美腿一区| 日韩一区精品| 91亚洲无吗| 国产精品亚洲欧美一级在线| 欧美日韩亚洲一区三区| 久久激五月天综合精品| 久久激情综合网| 国产精品流白浆在线观看| 国产乱码精品一区二区三区亚洲人| 亚洲综合五月| 日韩美女精品| 国产精品亚洲片在线播放| 国产精品夜夜夜| 精品国内亚洲2022精品成人| 国产精品主播| 久久久久亚洲精品中文字幕| 成午夜精品一区二区三区软件| 粉嫩av一区二区三区四区五区 | 国产精品mm| 成人亚洲精品| 久久精品中文| 亚洲尤物在线| 中文在线日韩| 国产毛片一区二区三区| 另类欧美日韩国产在线| 国产伦久视频在线观看| 亚洲福利精品| 久久国产成人| 亚洲aⅴ网站| 精品72久久久久中文字幕| 欧美日韩视频网站| 视频一区在线播放| 国产精品丝袜在线播放| 国产精品久久久久久久免费观看 | 欧美日韩一区二区三区不卡视频 | 亚洲区国产区| 麻豆精品久久| 亚洲第一精品影视| 亚洲精品免费观看| 久久中文字幕一区二区三区| 免费看av不卡| 视频一区中文字幕| 国产精品毛片久久久| 美女一区网站| 亚洲精品中文字幕99999| 国产精品大片| 欧美粗暴jizz性欧美20| 亚洲字幕久久| 国产伦久视频在线观看| 日韩精品一二三四| jizzjizz中国精品麻豆| 免费看欧美美女黄的网站| 国产激情久久| 国产一区亚洲| 久久成人av| 亚洲综合电影一区二区三区| 国产精久久久| 亚洲免费激情| 老牛国内精品亚洲成av人片 | 日本午夜精品久久久| 亚洲深夜视频| 日韩一区二区三区免费视频 | 一级欧美视频| 伊人久久视频| 日韩av电影一区| 成人免费电影网址| 69精品国产久热在线观看| 亚洲午夜av| 美女在线视频一区| 视频一区在线播放| 97精品在线| 欧美色综合网| 国产精品日韩久久久| 成人综合一区| 日本h片久久| 欧美不卡视频| 精品久久影院| 日韩高清在线不卡| 国产婷婷精品| 蜜臀国产一区| 国产精品免费不| 中文不卡在线| 亚洲激情av| 精品免费av在线| 精品国产美女a久久9999| 99在线精品视频在线观看| 久久电影tv| 国产精品久久久久久久久久齐齐| 婷婷成人基地| 日本一区二区免费高清| 日韩和欧美一区二区| 好看的av在线不卡观看| 久久午夜影院| 国产精品美女午夜爽爽| 在线视频亚洲欧美中文| 久久国产小视频| 国产精品国产三级国产在线观看| 日韩精品国产欧美| 亚洲欧美激情诱惑| 伊人久久大香线蕉av不卡| 精品一区二区三区亚洲| 久久国产生活片100| 日韩免费精品| 日韩一区精品| 亚洲18在线| 亚洲青青久久| 免费成人av在线播放| 国产精品外国| 视频一区国产视频| 美女久久网站| 美女黄网久久| 亚洲日本国产| 日韩和欧美一区二区三区| 亚洲精品无播放器在线播放|