@SpringBootApplication public class SpringBootStudyConfigApplication public static void main(String[] args) { SpringApplication.run(SpringBootStudyConfigApplication.class, args); } }
是 @Configuration @EnableAutoConfiguration @ComponentScan 三個註解的複合java
請注意它的返回值:ConfigurableApplicationContextweb
疑問:spring
一、ApplicationContextInitializer是作什麼用的? 請了解它的接口註釋、方法註釋、實現類有哪些。 二、 ApplicationListener是作什麼用的?編程
疑問:api
一、參數配置在哪裏完成的加載?tomcat
在學習參數配置時學習到了一個很重要的類 ConfigFileApplicationListener 。瞭解到在它裏面完成的加載,它又是 在什麼時候被誰調用的呢?服務器
ConfigFileApplicationListener 的類定義mvc
它是一個EnvironmentPostProcessor,也是一個ApplicationListener,應該就是經過它們來完成的調用!app
1)實現的EnvironmentPostProcessor方法,在這裏完成了加載配置文件的工做。webapp
2) 實現的ApplicationListener方法
問: ApplicationEnvironmentPreparedEvent這個事件會在哪裏發佈?
想要看它的加載執行過程怎麼辦? 在加載的代碼處打個斷點就能夠看到完整的加載過程了!
1.ConfigurableApplicationContext 建立
createApplicationContext()
默認的三個常量類名是什麼?
2.準備過程
3.刷新過程
4.auto configuration的bean定義加載:
問題:一、META-INF/spring.factories中指定的auto configuration Bean定義在哪裏完成的加載? 整個過程的代碼已看完,沒看到這塊代碼,代碼茫茫,如何找到加載它們的代碼?
思考:必定會從META-INF/spring.factories中加載,加載的方法是哪一個? 前面的代碼中已見過從META-INF/spring.factories中加載其餘的:
那就從這個getSpringFactoriesInstances(...)方法調用中找到一個合適的點,打個斷點來看誰會加載自動配置
看到,它是調用的SpringFactoriesLoader.loadFactoryNames(type, classLoader));
在它上打個斷點,來看何時會加載自動配置的配置類:
獲得調用棧:
從調用棧看到是在進行ConfigurationClassPostProcessor處理階段
其實,祕密在@SpringBootApplication複合的 @EnableAutoConfiguration 註解
AutoConfigurationImportSelector 乾的這個事
重點說明:AutoConfigurationImportSelector 實現了 DeferredImportSelector
DeferredImportSelector 是延遲導入選擇器。所謂延遲:在全部指定的、包掃描到的@Configuration類中的 bean定義註冊後,纔會來處理延遲導入的@Configuration類
疑問:
一、這裏自動配置爲何要以DeferredImportSelector 延遲導入的方式? 答案:讓咱們本身編程配置的bean提早註冊,這樣自動配置時的條件判斷能發現到咱們配置的,就能作到再也不配置 自動配置的bean等。好比:若是咱們本身配置了數據源bean,則使用咱們配置的數據源,不在自動配置數據源。數 據源自動配置的代碼中能夠看到@ConditionalOnMissingBean({ DataSource.class, XADataSource.class }):
5.callRunners(context, applicationArguments) 解讀
在代碼中咱們看到,從applicationContext 獲取了全部 ApplicationRunner、CommandLineRunner類型的bean, 並執行了它們的run方法。
疑問
一、ApplicationRunner 是什麼?有什麼用?
二、CommandLineRunner是什麼?有什麼用? 兩個是一樣的用途:當ApplicationContext刷新好後,來執行你的應用邏輯。
示例:
除此以外,你還有什麼方式來執行應用邏輯嗎?
6.Tomcat是如何跑起來的?
從建立ApplicationContext處開始
看AnnotationConfigServletWebServerApplicationContext類
看它的父類ServletWebServerApplicationContext
WebServer的建立過程:
onRefresh()方法是AbstractApplicationContext中定義的供子類實現的空模板方法,在refresh()方法中被調用。
看它裏面的getWebServerFactory():從容器中找ServletWebServerFactory類型的Bean,只能有一個。
再看經過factory.getWebServer()獲得WebServer,先看接口定義:
在ServletWebServerApplicationContext中能夠看到作這個start動做的方法:
TomcatServletWebServerFactory中的實現:
疑問:TomcatServletWebServerFactory這個Bean哪裏配置的? 在spring boot 的自動配置中能夠找到
看 ServletWebServerFactoryAutoConfiguration
看ServletWebServerFactoryConfiguration.EmbeddedTomcat.class
看到 @EnableConfigurationProperties(ServerProperties.class)
能夠配置哪些服務器參數:
再來看下tomcat能夠配置什麼參數
參數配置示例: application.yml
7.spring boot web 中集成 Servlet api
一、使用 Servlet Filter 有兩種方式
方式一 servelt3.0 註解 + @ServletComponentScan
方式二:ServletRegistrationBean和FilterRegistrationBean註冊方式
二、jsp作視圖技術
spring boot 不推薦使用jsp。
集成jsp的步驟:
一、引入對應的jar
二、建立jsp文件放置目錄 src/main下建立 webapp/WEB-INF/jsp/
三、在application.yml中配置spring.mvc.view
四、編寫Controller jsp
五、運行、測試