今日份學習之Spring Boot自動配置實現原理

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過前面章節的學習,我們掌握了使用Spring Boot框架進行實際應用開發的方法。在使用Spring Boot 的過程中,我們時常會爲一些看似簡單,但實際上蘊藏了強大功能的實現而驚呼,下面就讓我們來揭開它的神祕面紗,做到知其然,進而知其所以然。在認識Spring Boot 的實現原理之後,我們在使用某些功能時,就能夠做到心中有數,從而更好地使用它。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"1 Spring Boot主程序的功能","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-1是Spring Boot應用的一個典型主程序,它看起來非常簡單,使用了一個同樣看起來非常簡單的註解@SpringBootApplication,並用一個非常普通的main方法運行SpringApplication的 run方法。這個簡單的主程序將會加載一個應用所需的所有資源和配置,最後啓動一個應用實例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-1Spring Boot應用主程序","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/1b/1b9b0f2f912b4549476f49f90120e1b0.jpeg","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"1.1SpringApplication的run方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Spring Boot的主程序有什麼神奇的地方呢?可以從 SpringApplication的run方法說起,這是應用主程序開始運行的方法,它的源代碼如代碼清單10-2所示。這個方法讓我們能夠看清楚Spring Boot的一切祕密所在,它首先開啓一個SpringApplicationRun-Listeners監聽器,然後創建一個應用上下文ConfigurableApplicationContext,通過這個上下文加載應用所需的類和各種環境配置等,最後啓動一個應用實例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-2SpringApplication中run的源代碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/9b/9ba2b8b13e38d637ebdef7119500a33e.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你使用過Spring框架,就會更加清楚這種加載應用的實現機制。在Spring 中,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"加載一個應用,主要是通過一些複雜的配置來實現的。這樣看來,Spring Boot 只不過是把這些本來由程序員做的工作,事先幫我們實現罷了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"1.2創建應用上下文","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個應用能夠正常運行起來,需要一些環境變量、各種資源和一些相關配置等,從創建應用上下文ConfigurableApplicationContext的源代碼中,我們可以看到這種實現機制,如代碼清單10-3所示。其中,this.load (context, sources.toArray (new Object[sources.size(]))將調用BeanDefinitionLoader來加載應用定義的和需要的類及各種資源。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-3創建應用上下文——createAndRefreshContext的源代碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/df/dfec8bbc6a5ad935893d134c327e4770.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/67/67ef2599c5c70d050469222967878811.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"1.3自動加載","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在BeanDefinitionLoader 中,有一個load (Class> source)方法用來加載類定義,如代碼清單10-4所示。這裏的source就是代碼清單10-1中定義的Application.class。在程序中通過isComponent檢查是否存在註解,如果有註解,則調用註解相關的類定義。這樣註解@SpringBootApplication將被調用,它不但會導入一系列自動配置的類,還會加載應用中一些自定義的類。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-4BeanDefinitionLoader 中 load(Class>source)源代碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/63/63440e918b753be9250b284018e43be5.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/11/11c9a2880d07cc76687d4f9ea366e5b1.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從以上分析可知,一個簡單的Spring Boot主程序,通過運行一個run方法,就將引發一系列複雜的內部調用和加載過程,從而初始化一個應用所需的配置、環境、資源及各種類定義等。特別是導入了一系列自動配置類,實現了強大的自動配置功能,這是Spring Boot框架最引人注目的地方。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"2.Spring Boot自動配置原理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所有的自動配置都是從註解@SpringBootApplication引人的,我們來看看它的源代碼,就一切都明白了。如代碼清單10-5所示,註解@SpringBootApplication其實又包含了三個非常重要的註解,即@Configuration、@EnableAutoConfiguration和@ComponentScan,其中註解@EnableAutoConfiguration就是啓用自動配置的,並將導入一些自動配置的類定義,註解@ComponentScan將掃描和加載應用中的一些自定義的類。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-5SpringBootApplication源代碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/88/886e3ec268ada1337b5d4328e6787f63.jpeg","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"2.1自動配置的即插即用原理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"EnableAutoConfiguration最終會導入一個自動配置的類列表,如代碼清單10-6所示。列表中的自動配置類很多,這些配置類中大都將被導入,並處於備用狀態中,這如同電器中準備了一些插槽一樣,即實現了即插即用的原理。這樣,當項目中引入了相關的包時,相關的功能將被啓用。例如在項目的Maven管理中配置了Redis 的引用,那麼Redis的功能將被啓用,這時啓動應用,程序將嘗試讀取有關Redis的配置信息。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-6自動配置類部分列表","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/5c/5ce23b119a678fab296f5f6a3df648f4.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"2.2自動配置的約定優先原理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在自動配置中加載一個類的配置時,首先讀取項目中的配置,只有項目中沒有相關配置才啓用配置的默認值,這就是自動配置的約定優先原理。代碼清單10-7是Thymeleaf配置類的源代碼,如果在項目的配置文件中沒有配置spring.thymeleaf的相關參數,就使用Thymeleaf 的默認配置,默認配置將使用templates作爲HTML文件的存放路徑。在前面章節使用Thymeleaf的實例中,就是使用了這個默認配置。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-7Thymeleaf 配置源代碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/aa/aa3bac1d3cc720e5d4f716ac182aac19.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"3.提升應用的性能","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Spring Boot 的自動配置在給我們提供很大便利的同時,難免會有一些副作用,即增加了應用啓動的時間、一些內存和CPU的消耗等。如果應用對性能要求很高,就可以根據自動配置的原理,使用一些技巧進行優化。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"3.1更改加載配置的方式","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果能清楚一個應用需要哪些配置,就能夠更改加載配置的方式,即不使用自動配置,而是改爲指定加載一些應用所需的配置。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了弄清楚一個應用需要加載哪些配置,可以使用Maven調試的方式來啓動一個應用,然後從控制檯的輸出日誌中,確定哪些是這個應用需要加載的配置類。下面使用第1章中簡單的實例項目來說明這種操作。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,在IDEA的Edit Configuration中增加一個Maven配置,工作路徑選擇項目根目錄,在命令行中輸入: spring-boot:run -Ddebug,並把配置保存爲debug,如圖10-1所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/93/93715ab573b4456403a9d1312ff6fa7b.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以 Debug方式運行debug配置,啓動應用,然後在控制檯中找出Positive matches的類,如代碼清單10-8所示。Positive matches就是這個應用所需加載的一些配置類。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-8加載自動配置的Positive matches類列表","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2b/2b9ba64cf3c6a4a81f6e7c47e78fb57a.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過整理後,得出這個應用需要加載的配置類列表,如代碼清單10-9所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-9整理後的Positive matches類列表","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3b/3b591067d3c4ad181bd8a7953f18e572.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據這個配置類加載列表,就可以在主程序中使用註解@Configuration來代替註解@SpringBootApplication,並用註解@Import 指定需要加載的配置類,經過更改後的應用主程序如代碼清單10-10所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-10主程序中指定加載的配置類","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2c/2cd69bf5f19e7f070048ea003c3fb240.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"3.2將Tomcat換成Jetty","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外,爲了提高應用的性能,還可以更改默認使用的Tomcat插件,換成更加小巧的Jetty插件。例如,代碼清單10-11是在工程的Maven配置中排除引用默認的Tomcat,轉而引用Jetty的依賴。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼清單10-11使用Jetty的 Maven配置","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/44/4461c98defc410fb67cfd032b6a19365.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"4.性能對照測試","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過上面一些改造之後,可以對照測試一下,看看效果如何。打開IDEA的 EditConfiguration對話框,增加一個Application配置,工作目錄選擇工程根目錄,並選擇工程主程序,然後在VM options 中輸入如下配置參數:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"-Dcom.sun.management.jmxremote -Dcom.sun.management .jmxremote.port=\"9004\"-Dcom.sun. management .jmxremote.authenticate=\"false\"","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"-Dcom . sun . management . jmxremote.ssl= \"false\"","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣配置的目的,是讓我們可以使用JConsole來觀察應用運行的各項性能指標。配置完成後的效果如圖10-2所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/45/45e891cb710a7b44d303d43ea2243a92.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對比改造前後的兩種情況,改造後應用的啓動時間有所加快。改造前啓動應用的時間如下所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"started Application in 3.171 seconds (JVM running for 4.941)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"改造後啓動應用的時間如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"started Application in 2.957 seconds (JVM running for 5.869)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應用啓動後,使用JConsole新建一個連接,可以觀察應用運行的各項性能指標。根據上面配置的參數,可以在遠程進程中輸入 localhost:9004,然後單擊“連接”按鈕,如圖10-3所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"改造前後的兩種運行情況對照如圖10-4所示。圖中各項指標處於0的位置是中間停止時的狀態,從圖中可以看出,改造後內存的使用量明顯減少了,CPU的佔用也有所改善,加載的類減少了一點,並不是很明顯。從總體上來說,性能是有所改善了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/87/87bd4e79b14647606b9e051baea8eedf.jpeg","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/94/941dc2eaf49f36dcaf0431644c9fda2f.png","alt":"今日份學習之Spring Boot自動配置實現原理","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"5.小結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本章分析了Spring Boot應用主程序的內部實現的一些源代碼,及其功能強大的自動配置的實現原理,使我們認識了神奇的Spring Boot 的內部實現機制,在看似簡單的調用中,其實包含着複雜的內部實現。這就不難理解,爲什麼使用Spring Boot可以那麼簡單,這是因爲它把一些複雜的實現,都事先幫我們做好了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"基於對Spring Boot 的深入瞭解,特別是認識自動配置的實現原理之後,就可以改造一個應用加載配置的方式,從而達到提高性能的目的。雖然這種改造的作用並不是特別明顯,但是不管怎樣,至少能幫助我們加深對Spring Boot的理解。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過前面章節的應用實例,我們也知道,在 Spring Boot中使用數據庫也是非常簡單的,那麼Spring Boot在使用數據庫方面,其內部實現又是怎樣一個引人入勝的工程呢?下一章將分析Spring Boot在使用數據庫方面的一些實現原理,看看它又有什麼神奇之處。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最後,還給大家整理了一份面試寶典有需要的添加小編的vx:mxzFAFAFA即可免費領取!!!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2e/2e0ba25110125cc161e57638cd56da6b.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/dd/dda9a4970e47abcb97f80068aa798d98.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/8d/8d039ead9e80f32d5046996c7a25f3cd.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章