您好,登錄后才能下訂單哦!
springboot2.0.6如何創建應用程序,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
public ConfigurableApplicationContext run(String... args) { ......//省略 ConfigurableApplicationContext context = null; ......//省略 try { ......//省略 // 根據應用類型創建對應的Context容器 context = createApplicationContext(); ......//省略 // 刷新Context之前的準備 // 將SpringApplicationRunListeners、ConfigurableEnvironment、ApplicationArguments、Banner等重要組件與上下文對象關聯 prepareContext(context, environment, listeners, applicationArguments, printedBanner); ......//省略 } ......//省略 } catch (Throwable ex) { // 啟動錯誤報告處理 handleRunFailure(context, ex, exceptionReporters, listeners); throw new IllegalStateException(ex); } ......//省略 }
應用上下文環境是什么,都包括那些呢?其可以理解成SpringIoC容器的升級,即其在IoC容器的基礎上豐富了一些高級功能,而且其對IoC容器是持有關系。它的beanFactory就是IoC容器。其包括運行系統環境、Java環境、Spring運行環境、項目配置、啟動指令等等。在SpringBoot中應用類型分三種,如下面枚舉中所示
public enum WebApplicationType { /** * 應用程序不是web應用,也不應該用web服務器去啟動 */ NONE, /** * 應用程序應作為基于servlet的web應用程序運行,并應啟動嵌入式servlet web(tomcat)服務器。 */ SERVLET, /** * 應用程序應作為 reactive web應用程序運行,并應啟動嵌入式 reactive web服務器。 */ REACTIVE }
對應不同的應該類型,SpringBoot給出了三種對應的應用上下文。
從結構上看它們都繼承了GenericApplicationContext,而GenericApplicationContext中定義了beanFactory
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry { private final DefaultListableBeanFactory beanFactory; ... public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); } ... }
從上面結構可知當我們初始化了應用上下文時,同樣也觸發了GenericApplicationContext類的構造函數,從而創建了IoC容器。仔細看他的構造函數,有沒有發現一個很熟悉的類DefaultListableBeanFactory,這個DefaultListableBeanFactory就是IoC容器真實面目了。在后面的refresh()方法分析中,DefaultListableBeanFactory是無處不在的。
我們可以調用createApplicationContext方法根據應用類創建具體的applicationContext
public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot." + "web.servlet.context.AnnotationConfigServletWebServerApplicationContext"; public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework." + "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext"; protected ConfigurableApplicationContext createApplicationContext() { Class<?> contextClass = this.applicationContextClass; if (contextClass == null) { try { switch (this.webApplicationType) { case SERVLET: contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS); break; case REACTIVE: contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS); break; default: contextClass = Class.forName(DEFAULT_CONTEXT_CLASS); } } catch (ClassNotFoundException ex) { throw new IllegalStateException( "Unable create a default ApplicationContext, " + "please specify an ApplicationContextClass", ex); } } // 根據Class創建Application return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass); }
以web工程為例,其上下文為AnnotationConfigServletWebServerApplicationContext
public static <T> T instantiateClass(Class<T> clazz) throws BeanInstantiationException { Assert.notNull(clazz, "Class must not be null"); if (clazz.isInterface()) { throw new BeanInstantiationException(clazz, "Specified class is an interface"); } try { // 走 clazz.getDeclaredConstructor 方法 Constructor<T> ctor = (KotlinDetector.isKotlinType(clazz) ? KotlinDelegate.getPrimaryConstructor(clazz) : clazz.getDeclaredConstructor()); return instantiateClass(ctor); } ......//省略 } public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException { Assert.notNull(ctor, "Constructor must not be null"); try { ReflectionUtils.makeAccessible(ctor); // 走 clazz.newInstance方法 return (KotlinDetector.isKotlinType(ctor.getDeclaringClass()) ? KotlinDelegate.instantiateClass(ctor, args) : ctor.newInstance(args)); } ......//省略 }
初始化上下文實例結果如下
看完上述內容,你們掌握springboot2.0.6如何創建應用程序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。