1.springboot是一個輕配置的框架,以前spring的配置有很多,很多bean的裝配都沒有寫在配置文件里面,spring一開始為什么要把配置寫在配置文件里面呢,實際上一開始的初衷是很好的,是為了解耦,以為代碼經過編譯之后是看不到的,但是配置文件編譯后是能看到的,java文件編譯后變成class,但是配置文件編譯后還是xml,通過xml我就能知道這個工程里面大概配置了那些東西,而且能解耦能調配,把所有的配置文件寫在xml有好處,但是到了真正的項目里面會發現xml太重了,里面放置了太多的東西,但是其實真正要頻繁去修改的東西沒有那么多,可能用戶數據庫部分修改的比較多,但是例如視圖解析器,SpringBoot中tampleaf就直接用了,不需要在自己去配置半天,如果最后又要求被改成jsp,那么就非常抓狂
2。 如果兩個Controller里面有寫相同的url,啟動會報錯
如果Controller和WebConfiguration里面的addViewControllers中跳轉url一樣,那么啟動不會報錯,會被Controller里面的url所覆蓋
Springboot源碼解析視頻:觀后感自己總結
1-7基礎鋪墊
Initializer初始化意思就是: 一個空房子里面什么都沒有,往里面放點東西
1-1spi機制:tomcat實現servlet規范要實現一個ServletContainerInitializer接口,spi里面寫着自己實現上面接口的位置,springs實現web.xml里面的所有信息都要加載到ServletContext的上下文環境里面
1-2初始化容器:spring也要遵循Servlet規范 SpringServletContainerrInitializer也實現ServletContainerInitializer接口,然后初始化WebApplicationInitializer上下文環境,往里面加東西(bean,上下文環境)。通過實現WebApplicationInitializer,在其中可以添加servlet,listener等,在加載Web項目的時候會加載這個接口實現類,從而起到web.xml相同的作用。
1-3認識ApplicationContext:是spring繼BeanFactory之外的另一個核心接口或容器,允許容器通過應用程序上下文環境創建、獲取、管理bean。為應用程序提供配置的中央接口。在應用程序運行時這是只讀的,但如果實現支持這一點,則可以重新加載。ApplicationContext的主要實現類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認從類路徑加載配置文件,后者默認從文件系統中裝載配置文件
1-4BeanFactory和FactoryBean區別:BeanFactory是個Factory,也就是IOC容器或對象工廠,FactoryBean是個Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生產或者修飾對象生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式類似。
BeanFactory:
BeanFactory定義了IOC容器的最基本形式,並提供了IOC容器應遵守的的最基本的接口,
也就是Spring IOC所遵守的最底層和最基本的編程規范。
在Spring代碼中,BeanFactory只是個接口,
並不是IOC容器的具體實現,但是Spring容器給出了很多種實現,
如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某種功能的實現。
FactoryBean:
一般情況下,Spring通過反射機制利用<bean>的class屬性指定實現類實例化Bean,
在某些情況下,實例化Bean過程比較復雜,如果按照傳統的方式,則需要在<bean>中提供大量的配置信息。
配置方式的靈活性是受限的,這時采用編碼的方式可能會得到一個簡單的方案。
Spring為此提供了一個org.springframework.bean.factory.FactoryBean的工廠類接口,
用戶可以通過實現該接口定制實例化Bean的邏輯。
FactoryBean接口對於Spring框架來說占用重要的地位,Spring自身就提供了70多個FactoryBean的實現。
它們隱藏了實例化一些復雜Bean的細節,
給上層應用帶來了便利。從Spring3.0開始,FactoryBean開始支持泛型,即接口聲明改為FactoryBean<T>的形式
視頻里可以用User對象實現FactoryBean<User>接口,將其注入到容器,就可以通過SpringApplication.run方法拿到ApplicationContext,以調用該bean
1-5BeanDefinition:我們一般獲取對象的方式有兩種,一種是手動直接 new;另一種是交給 Spring 管理,Spring 將管理的對象稱之為 Bean,容器會先實例化 Bean,然后自動注入,實例化的過程就需要依賴 BeanDefinition。BeanDefinition 用於保存 Bean 的相關信息,包括屬性、構造方法參數、依賴的 Bean 名稱及是否單例、延遲加載等,它是實例化 Bean 的原材料,Spring 就是根據 BeanDefinition 中的信息實例化 Bean。
1-6,7bean的創建過程和PostProcessor后置處理器:beanFactoryPostProcessor可以對BeanDefinition在未實例化之前進行拓展,BeanPostProcessor可在初始化前后進行干預
8-進入springboot源碼階段
1-8:SpringAplication構造:從SpringbootApplication啟動類main方法中run進入,
最核心的一行代碼刷新容器 338:refreshContext(context),而前面的一切都是再做准備(准備環境,上下文,上下文初始化)。最終進入到org\springframework\context\support\AbstractApplicationContext.java類中的refresh()方法里
1-13:Multicaster多路廣播器:里面有很多的Listener,通過Listener去監聽事件,觀察者設計模式的核心
1-14:包裝類:利用反射進行包裝類賦值更加方便
1-15:自動裝配原理:(講義 自動裝配):
(25條消息) Spring Boot面試殺手鐧————自動配置原理Morty的技術樂園-CSDN博客springboot自動配置原理
版本1
Spring Boot啟動的時候會通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動配置類,
並對其進行加載,而這些自動配置類都是以AutoConfiguration結尾來命名的,
它實際上就是一個JavaConfig形式的Spring容器配置類,
它能通過以Properties結尾命名的類中取得在全局配置文件中配置的屬性如:server.port,
而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對應的屬性進行綁定的
版本2
在運行main方法的時候會運行主類上重要的@EnableAutoConfigration 注解會導入一個自動配置選擇器去掃描每個jar包的META-INF/xxxx.factories 這個文件,
這個文件是一個key-value形式的配置文件,里面存放了這個jar包依賴的具體依賴的自動配置類。
這些自動配置類又通過@EnableConfigurationProperties 注解支持通過xxxxProperties 讀取application.properties/application.yml屬性文件中我們配置的值。
如果我們沒有配置值,就使用默認值,這就是所謂約定>配置的具體落地點。
整合版本1和2
Spring Boot啟動的時候會運行主類上重要的@EnableAutoConfigration 注解會導入一個自動配置選擇器去掃描每個jar包的META-INF/xxxx.factories 這個文件,
這個文件是一個key-value形式的配置文件,里面存放了這個jar包依賴的具體依賴的自動配置類,
且都是都是以AutoConfiguration結尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類。
這些自動配置類又通過@EnableConfigurationProperties注解支持,
通過以xxxxProperties結尾命名的類中取得在全局配置文件中配置的屬,
如application.properties/application.yml屬性文件中我們配置的值。
如果我們沒有配置值,就使用默認值,這就是所謂約定>配置的具體落地點。
