1. 程式人生 > >Spring 簡介和啟動資訊分析

Spring 簡介和啟動資訊分析

Spring Boot 優點

  1. 輕量化
  2. 提供 Spring 框架各種預設配置來簡化專案配置
  3. 內嵌 Web 容器
  4. 沒有冗餘程式碼生成和XML配置要求

Maven 導包

  1. spring-boot-starter:核心模組,包括了自動配置支援、日誌和YAML
  2. spring-boot-starter-test:測試模組,包括JUnitHamcrestMockito
  3. spring-boot-starter-web
    Web模組

一個 Spring Boot 案例應該包括四個部分

  1. 主載入類
  2. 邏輯實現類
  3. 單元測試類
  4. 以及資源配置檔案

建立SpringBoot 很簡單 ,直接用idea的選擇web工程就行

Spirng Boot 啟動debug日誌閱讀筆記

1、b.l.ClasspathLoggingApplicationListener :先輸出使用的各種jar包

2、 一個呆萌的SpringBoot 代表

3、Starting SpringbootlearnApplication on ZhangWenLiang with PID 7664 會啟動一個java執行緒 PID 為7664 ,隨機的,這個根據計算機作業系統給的隨機排程

4、zu.zwl.SpringbootlearnApplication : The following profiles are active: dev,devdb

打印出所選擇的profiles,這裡dev是我的開發環境properties和配置環境bean

 

5、然後跳過了很多個相同的配置檔案,很納悶 不懂

6、ationConfigEmbeddedWebApplicationContext :root of context hierarchy 載入了上下文

7、然後載入了兩個預設配置檔案

ationConfigEmbeddedWebApplicationContext : Unable to locate MessageSource

with name 'messageSource':usingdefault[org.springfra[email protected]]

 

MessageSource :i18n用的

applicationEventMulticaster:事件驅動模型 具體幹啥的不知道。應該很關鍵吧

8、t.TomcatEmbeddedServletContainerFactory : None of the document roots [src/main/webapp, public, static] point to a directory and will be ignored.

最開始沒有webapp目錄,我自己手動建立了,重啟試試(過程中歌曲竟然卡了一下)

這裡的程式碼變為.t.TomcatEmbeddedServletContainerFactory : Document root: J:\MAKER\CodeFile\idea\springbootlearn\src\main\webapp ,證明成功了

我新增一個index.html 試試,看重新整理後能自動載入不。     是可以的

9、s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8989 (http)

在8989埠啟動了

10、o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext

初始化內嵌的webApplicationContext上下文

Root WebApplicationContext: initialization completed in 2520 ms 還是挺快的

11、o.s.b.w.s.ServletContextInitializerBeans : Added existing Servlet initializer bean 'dispatcherServletRegistration' 註冊web的總跳轉dispatcher

org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration.class

12、o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'characterEncodingFilter'

org/springframework/boot/autoconfigure/web/HttpEncodingAutoConfiguration.class

初始化 字元編碼過濾器

看下原始碼HttpEncodingAutoConfiguration.class

裡面有一個annotation

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)

一個不可改變數

private final HttpEncodingProperties properties; 

應該是有一個properties檔案,我找找在哪

在這個包下面找到了spring-configuration-metadata.json 檔案下有

就這樣設定了把

13、o.s.b.w.s.ServletContextInitializerBeans :Created Filter initializer for bean 'hiddenHttpMethodFilter' 幹什麼東東的? 它是前端後端資料互動時restFul風格的實現

用的這個org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.class

瀏覽器 form 表單只支援 GET與 POST 請求,而DELETE、 PUT 等 method 並不支援, Spring3.0 添加了一個過濾器,可以將這些請求轉換為標準的 http 方法,使得支援 GET、 POST、 PUT 與DELETE 請求。

實現過程:

前臺:

後臺:

需注意:

需要註冊org.springframework.web.filter.HiddenHttpMethodFilter監聽器來代替最初的org.springframework.web.servlet.DispatcherServlet

 

看下原始碼

裡面有很多前臺的東西

估計是和前臺有關

 

14、o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'httpPutFormContentFilter'; order=-9900, resource=class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.class]

也是監聽器 這次和put提交方式有關,需註冊,該過濾器只能接受enctype值為application/x-www-form-urlencoded的表單 ,我累個去,網上對其解釋千篇一律,無語,啥時候google了,我先試著讀下原始碼,也是WebMvcAutoConfiguration 。未果,終。

 

 

15、o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'requestContextFilter'; order=-105, resource=class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class] 這個是內部類

requestContextFilter 是將頁面提交的request轉發到Controller

16、然後定義各個filter的攔截路徑 / 只攔截 /xxxx , /*攔截所有 /xxx /xxx.jsp

17、然後是初始化過濾器(上面是建立bean)

18、s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]306279ee: startup date [Tue Sep 26 23:22:39 CST 2017]; root of context hierarchy

註冊總的 controler bean

19、緊接著是對映我們自定義的controller

s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/first]}" onto public java.util.Map<java.lang.String,java.lang.Object>zzu.zwl.controller.UserController.name1(javax.servlet.ServletResponse)

20、然後是裝配好的 對映

兩個error頁面,一個返回json,一個view ,一個/**配置,一個/**/favicon.ico來設定圖示

21、o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup

初始化成功了算是

22、ationConfigEmbeddedWebApplicationContext : Unable to locate LifecycleProcessor with name 'lifecycleProcessor':usingdefault[[email protected]1bd44c] 一個控制程序的風格,裡面一個

private volatile long timeoutPerShutdownPhase = 30000; 

23、utoConfigurationReportLoggingInitializer : 日誌報告輸出

 

24、

成功啟動

 

25、會自動檢測程式碼變化,然後自動再次初始化

 

總結:web方面做的比較多,可能後期做著會非常完善吧 ,寫篇讀書日誌然後睡覺嘍