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

您的位置:首頁技術文章
文章詳情頁

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

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

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

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

值得關注的有SpringApplication.run以及注解@SpringBootApplication

run方法

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

獲取監聽器

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));// 創建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 { // 通過名字創建類的class對象 Class<?> instanceClass = ClassUtils.forName(name, classLoader); Assert.isAssignable(type, instanceClass); // 構造器獲取 Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes); // 創建具體實例 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());// 創建打印器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);}

最終輸出內容類: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底層有了一個大致了解,只分析了主要方法,希望對大家有幫助

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品亚洲美女网站| 天堂成人国产精品一区| 亚洲开心激情| 99国产精品99久久久久久粉嫩| 激情欧美一区二区三区| 欧美aa在线观看| 性欧美videohd高精| 日韩欧美二区| 丝袜美腿诱惑一区二区三区| 久久久精品午夜少妇| 久久婷婷一区| 国产精品av一区二区| 午夜欧美视频| 美女91精品| 午夜精品免费| 麻豆91精品| 日韩精品成人在线观看| 日韩高清二区| 欧美1区2区3| 欧美男人天堂| 欧美日韩国产探花| 在线一区二区三区视频| 日本成人中文字幕| 久久精品资源| 成人免费网站www网站高清| 国产精品av久久久久久麻豆网| 国产一区导航| 久久精品97| 国产传媒在线| 久久中文亚洲字幕| 亚洲免费成人| 日韩不卡手机在线v区| 国产精品久久亚洲不卡| 久久uomeier| 亚洲欧洲日本mm| 日本免费一区二区视频| 精品精品国产三级a∨在线| 亚洲www免费| 久久大逼视频| 国产精品三级| 91精品蜜臀一区二区三区在线| 亚洲一区二区动漫| 国产精品巨作av| 久久天堂成人| 亚洲丝袜美腿一区| 精品国产黄a∨片高清在线| 久久久久中文| 日韩三级精品| 久久久久一区| 青青国产91久久久久久| 日韩综合精品| 日韩中文字幕| 日韩一区自拍| 日本a级不卡| 中文在线免费视频| 亚洲三级国产| 日韩电影免费网址| 亚洲1区在线观看| 国产66精品| 在线视频精品| 精品视频高潮| 免费人成黄页网站在线一区二区| 欧美激情亚洲| 国产色综合网| 麻豆91在线播放| 性一交一乱一区二区洋洋av| 免费看一区二区三区| 夜夜嗨av一区二区三区网站四季av| 国产乱人伦丫前精品视频| 精品捆绑调教一区二区三区| 四虎成人精品一区二区免费网站| 中文av在线全新| 日本视频中文字幕一区二区三区| 久久久久久美女精品| 亚洲小说春色综合另类电影| 国产aa精品| 中文字幕一区二区av| 欧美三级精品| 国产精品久久久久毛片大屁完整版 | 精品国产中文字幕第一页| 伊人久久成人| 国产成人精选| 日韩国产在线一| 亚洲免费激情| 日韩理论视频| 国产精品任我爽爆在线播放 | 日本大胆欧美人术艺术动态| 午夜av不卡| 91成人在线| 蘑菇福利视频一区播放| 成人日韩在线| 麻豆成人91精品二区三区| 日日摸夜夜添夜夜添国产精品| 欧美一区二区三区高清视频 | 成人自拍av| 国产精成人品2018| 亚洲最新av| 国产精品丝袜xxxxxxx| 欧美影院三区| 欧洲精品一区二区三区| 精品视频在线观看网站| 欧美日韩一区自拍| 天堂久久一区| 鲁大师成人一区二区三区| 欧美午夜精品一区二区三区电影| av资源亚洲| 97精品国产| 精品久久不卡| 麻豆精品久久久| 日韩av中文在线观看| 亚洲免费观看| 在线国产一区| 免费视频国产一区| 久久国产亚洲| 亚洲播播91| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精品videossex久久发布 | 欧美专区一区二区三区| 午夜精品免费| 亚洲少妇诱惑| 日韩视频在线一区二区三区 | 欧美资源在线| 丝袜美腿一区二区三区| 日韩视频一区| 99热免费精品| 老鸭窝毛片一区二区三区| 亚洲一区网站| 亚洲美洲欧洲综合国产一区| 亚洲激情不卡| 午夜在线视频观看日韩17c| 狠狠久久婷婷| 欧美专区在线| 中文字幕日韩亚洲| 日韩一区二区三区四区五区| 亚洲va久久| 91精品一区| 国产乱人伦丫前精品视频| 国产精品一区二区精品视频观看| 国产精品天堂蜜av在线播放| 你懂的亚洲视频| 高清av一区| 亚洲1234区| 婷婷综合亚洲| 亚洲综合不卡| 日韩精品三区四区| 免费一级欧美在线观看视频| 精品久久久久中文字幕小说| а√天堂8资源在线| 久久九九精品| 亚洲免费中文| 日韩高清一区二区| 欧美精品二区| 福利一区视频| 激情丁香综合| 在线精品视频一区| 国产另类在线| 成人在线观看免费视频| 久久精品国内一区二区三区水蜜桃| 欧美不卡在线| 综合在线一区| 国产精品调教视频| 亚洲一区资源| 黄色成人91| 四虎精品一区二区免费| 老司机免费视频一区二区| 成人在线网站| 蜜桃av一区二区在线观看| 亚洲91网站| 粉嫩av一区二区三区四区五区| 亚洲成人国产| 亚洲免费毛片| 精品久久美女| 欧美日韩精品免费观看视频完整| 亚洲毛片一区| 精品国产亚洲一区二区三区在线 | 亚洲精品高潮| 欧美黄色一区二区| 久久精选视频| 日韩国产欧美三级| 国产乱码午夜在线视频| 丝袜脚交一区二区| 久久影院资源站| 亚洲一区久久| 老司机免费视频一区二区| 合欧美一区二区三区| 久久av网址| 天堂成人免费av电影一区| 九九99久久精品在免费线bt| 影院欧美亚洲| 麻豆成人91精品二区三区| 伊人久久成人| 欧美交a欧美精品喷水| 蜜桃精品在线| 日韩1区2区日韩1区2区| 欧美+亚洲+精品+三区| 国产欧美日韩亚洲一区二区三区| 日韩和的一区二在线| 日本欧美在线| 免费观看不卡av| 国产精品入口久久|