91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot2.0.6如何創建應用程序

發布時間:2021-09-13 13:56:23 來源:億速云 閱讀:115 作者:柒染 欄目:大數據

springboot2.0.6如何創建應用程序,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

解析SpringApplication的run方法中applicationContext相關分析

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);
   }
    ......//省略  
}

applicationContext

    應用上下文環境是什么,都包括那些呢?其可以理解成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給出了三種對應的應用上下文。

三種對應的應用上下文的類結構如下

springboot2.0.6如何創建應用程序

springboot2.0.6如何創建應用程序

springboot2.0.6如何創建應用程序

從結構上看它們都繼承了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是無處不在的。

創建applicationContext

我們可以調用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工程為例,其上下文為AnnotationConfigServletWebServerApplicationContextspringboot2.0.6如何創建應用程序

實例化類

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如何創建應用程序

    看完上述內容,你們掌握springboot2.0.6如何創建應用程序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    紫金县| 南平市| 沙湾县| 太湖县| 新密市| 铁力市| 图们市| 新泰市| 仁怀市| 龙门县| 哈密市| 盘山县| 和平县| 永年县| 广丰县| 仁怀市| 沁源县| 奎屯市| 葫芦岛市| 都江堰市| 彭泽县| 自治县| 福安市| 乌鲁木齐县| 咸阳市| 武山县| 浑源县| 卓资县| 凌源市| 麦盖提县| 华宁县| 马公市| 荃湾区| 隆德县| 交城县| 平凉市| 大悟县| 延庆县| 长沙市| 通州区| 虎林市|