Spring-boot-BASE
應(yīng)用回顧
約定優(yōu)于配置:可稱為約定編程, 是一種軟件的設(shè)計(jì)規(guī)范
什么是springboot
Springboot的設(shè)計(jì)是為了盡可能快的跑起來spring應(yīng)用程序并且盡可能的減少你的配置文件.-
Springboot主要特性
1、Springboot starter : 將常用的依賴分組進(jìn)行了整合, 將其合并到一個(gè)依賴中, 這樣就可以一次性添加到項(xiàng)目的Maven或者Gradle構(gòu)建中2、由于采用了JavaConfig的方式對(duì)Spring進(jìn)行配置, 并且提供了大量注解, 極大的提高了工作效率. 使編碼變得簡(jiǎn)單
3哈街、自動(dòng)配置 : Springboot的自動(dòng)化配置利用了Spring對(duì)條件化配置的支持, 合理的推測(cè)出所需要的bean并自動(dòng)化配置
4、部署變得簡(jiǎn)單 : Springboot內(nèi)置了三種servlet容器, Tomcat奔滑、Jetty妖谴、undertow 我們只需要一個(gè)java的運(yùn)行環(huán)境就可以跑Springboot的項(xiàng)目了, Springboot的項(xiàng)目可以打成一個(gè)jar包
Springboot 案例實(shí)現(xiàn)
-
引入熱部署概念: 插件名為 Spring-boot-devtools
熱部署原理分析 : 原理很簡(jiǎn)單, 我們?cè)诰庉嬈魃蠁?dòng)項(xiàng)目, 然后改動(dòng)相關(guān)代碼, 然后編輯器自動(dòng)觸發(fā)編譯并替換掉歷史的.class文件. 項(xiàng)目檢測(cè)到文件變更后會(huì)重啟spring-boot項(xiàng)目
1、分為兩種類加載器, base-classloader《第三方j(luò)ar包》、restart-classloader《開發(fā)者編寫代碼》
2、可以進(jìn)行資源排除不做更新操作. 全局文件配置 : 配置文件優(yōu)先級(jí)变屁、配置文件支持格式properties/yaml、springboot-2.4.0版本前后的配置文件優(yōu)先級(jí)
1意狠、屬性注入 : 配置文件的屬性注入
2粟关、value : 屬性注入
3、ConfigurationProperties (prefix = “xxx” ) : 批量屬性注入
4环戈、PropertySource (“classpath:/jdbc.properties”) : 指定外部屬性文件, 在類上添加Configuration : 聲明一個(gè)類為配置類
Bean : 聲明在方法上, 將方法的返回值加入Bean容器
日志框架
Spring框架默認(rèn)是JCL作為默認(rèn)日志輸出, Springboot 默認(rèn)選擇了 SLF4J 結(jié)合 LogBack
Spring源碼剖析
自動(dòng)化配置
SpringbootApplication 元注解配置
SpringBootConfiguration : 相當(dāng)于Configuration注解配置, 只不過Springboot對(duì)Configuration重新封裝配置了一下.
EnableAutoConfiguration : 很多以Enable開頭的注解, 其作用就是通過Import來收集并注冊(cè)特定場(chǎng)景相關(guān)的bean, 并加載到IOC容器.
AutoConfigurationPackage : 自動(dòng)配置包, 組合注解,
Import <Register.class> : 它是 Spring 框架的底層注解闷板,它的作用就是給容器中導(dǎo)入某個(gè)組件類
Import < AutoConfigurationImportSelector.class > :
可以幫助 Springboot 應(yīng)用將所有符合條件的 @Configuration 配置都加載到當(dāng)前 SpringBoot 創(chuàng)建并使用的 IOC 容器( ApplicationContext )中
有選擇的導(dǎo)入自動(dòng)配置類
自動(dòng)配置類的具體流程
從Spring.factories配置文件中加載自動(dòng)配置類
加載的自動(dòng)配置類中排除掉@EnableAutoConfiguration注解的exclude屬性所指定的自動(dòng)配置類
然后使用AutoConfigurationImportFileter接口過去過濾自動(dòng)配置類是否符合其標(biāo)注注解(若有標(biāo)注的話) @ConditionalOnClass,@ConditionalOnBean和@ConditionalOnWebApplication的條件, 若都符合的話則返回匹配結(jié)果.
然后觸發(fā)AutoConfigurationImportEvent事件, 告訴ConditionEvaluationReport 條件評(píng)估報(bào)告器對(duì)象來分別記錄符合條件和exclude的自動(dòng)配置類.
最后spring再將最后篩選后的配置類導(dǎo)入到IOC容器中.
CompnonentScan
basePackages、value:指定掃描路徑院塞,如果為空則以@ComponentScan注解的類所在的包為基 本的掃描路徑
basePackageClasses:指定具體掃描的類
includeFilters:指定滿足Filter條件的類
excludeFilters:指定排除Filter條件的類
@Conditional是Spring4新提供的注解遮晚,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè) bean
SpringApplication run方法啟動(dòng)流程
第一步:獲取并啟動(dòng)監(jiān)聽器
第二步:構(gòu)造應(yīng)用上下文環(huán)境
第三步:初始化應(yīng)用上下文
第四步:刷新應(yīng)用上下文前的準(zhǔn)備階段
第五步:刷新應(yīng)用上下文
第六步:刷新應(yīng)用上下文后的擴(kuò)展接口
自定義Starter代碼實(shí)現(xiàn)
自定義starter
- 自定義工程名稱為spring-boot-starter-xxx, 并導(dǎo)入依賴 spring-boot-autoconfigure
- 編寫java-Bean
- 編寫配置類MyAutoConfiguration
- resource新建Spring.factories
使用starter
- 導(dǎo)入自定義starter
- 在全局配置文件中配置屬性
- 編寫測(cè)試方法
自定義stater增強(qiáng)
- 新增標(biāo)記類 ConfigMarker
- 新增EnableRegisterServer注解
然后將其配置類新增條件注入 ConditionalOnBean
Ps:熱插拔技術(shù)
- 這個(gè)@Enablexxx注解就是一種熱拔插技術(shù) , 加了這個(gè)注解就可以啟動(dòng)對(duì)應(yīng)的starter
Springboot 數(shù)據(jù)訪問
數(shù)據(jù)源自動(dòng)配置
選擇數(shù)據(jù)庫驅(qū)動(dòng)庫文件
配置數(shù)據(jù)庫連接
配置spring-boot-starter-jdbc
編寫測(cè)試類
連接池配置方式
選擇數(shù)據(jù)庫連接池的庫文件, SpringBoot提供了三種方式<HikariCP, Commons DBPC2, Tomcat JDBC Connection pool>
數(shù)據(jù)源自動(dòng)配置
Springboot 啟動(dòng)流程
Springboot + Mybatis 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換
業(yè)務(wù)場(chǎng)景
- 隨著業(yè)務(wù)場(chǎng)景的增加, 百萬數(shù)據(jù)需要做讀寫分離操作. 分庫分表操作
解決思路
- 現(xiàn)在項(xiàng)目的結(jié)構(gòu)設(shè)計(jì)基本上是基于MVC的拦止,那么數(shù)據(jù)庫的操作集中在dao層完成县遣,主要業(yè)務(wù)邏輯在 service層處理,controller層處理請(qǐng)求汹族。假設(shè)在執(zhí)行dao層代碼之前能夠?qū)?shù)據(jù)源(DataSource) 換成我們想要執(zhí)行操作的數(shù)據(jù)源萧求,那么這個(gè)問題就解決了
原理圖
- 通過Spring內(nèi)置的AbstractRoutingDataSource, 它可以把多個(gè)數(shù)據(jù)源存儲(chǔ)在一個(gè)Map中, 并通過對(duì)應(yīng)的key值來獲取對(duì)應(yīng)的數(shù)據(jù)源. 因?yàn)锳bstractRoutingDataSource也是一個(gè)DataSource接口, 因此, 應(yīng)用程序可以先設(shè)置好Key, 訪問數(shù)據(jù)庫的代碼就可以從AbstractRoutingDataSource拿到對(duì)應(yīng)的一個(gè)真實(shí)的數(shù)據(jù)源, 從而訪問指定的數(shù)據(jù)庫
Springboot 緩存深入
JSR107
Java Specification Requests 的縮寫, Java規(guī)范請(qǐng)求
核心接口
CachingProvider、CachingManager顶瞒、Cache夸政、Entry和Expiry 有一個(gè)緩存提供者、緩存管理器搁拙、緩存對(duì)象秒梳、緩存鍵值對(duì)與緩存的有效期
CachingProvider : 緩存提供者, 創(chuàng)建法绵、配置、獲取酪碘、管理和控制多個(gè)CacheManager
CacheManager : 緩存管理者, 創(chuàng)建朋譬、配置、獲取兴垦、管理和控制多個(gè)Cache, Cache存在于CacheManager的上下文中徙赢。一個(gè)CacheManager僅對(duì)應(yīng)一個(gè)CachingProvider
Cache : 緩存, 由CacheManager創(chuàng)建, 生命周期也由CacheManager負(fù)責(zé), cache存在于CacheManger的上下文中. 是一個(gè)類似于Map的數(shù)據(jù)結(jié)構(gòu), 并臨時(shí)存儲(chǔ)以key為索引的值, 一個(gè)Cache僅被一個(gè)CacheManager所擁有
Entry : 緩存鍵值對(duì), 一個(gè)存儲(chǔ)在Cache中的key-value對(duì)
Expiry : 緩存有效期,
圖示
Spring緩存抽象
抽象的定義 : org.springframework.cache.Cache 和org.springframework.cache.CacheManager接口來統(tǒng)一不同的緩存技術(shù);并支持使用Java Caching(JSR-107)注解簡(jiǎn)化我們進(jìn)行緩存開發(fā)。
Spring Cache 只負(fù)責(zé)維護(hù)抽象層, 具體的實(shí)現(xiàn)由自己的技術(shù)選型來決定的, 將緩存處理與緩存技術(shù)解除耦合.
重要接口:
Cache : 緩存抽象的接口規(guī)范, 緩存實(shí)現(xiàn)有 : RedisCache 探越、 EhCache狡赐、 ConcurrentMapCache等.
CacheManager : 緩存管理器, 管理Cache的生命周期
Spring緩存使用
重要注解:
EnableCaching : 開啟基于注解的緩存
Cacheable : 主要針對(duì)方法的配置, 能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其結(jié)果進(jìn)行緩存
緩存名稱
cacheNames/value
Key
keyGenerator : 主鍵的生成策略
有效時(shí)長(zhǎng)
存儲(chǔ)值
緩存類型
CacheManager
CacheResolver
緩存條件
condition : 條件滿足
unless : 條件不滿足
是否異步 : sync
CacheEvict : 清空緩存
CachePut : 保證方法被調(diào)用, 又希望緩存被存儲(chǔ)
CacheConfig : 標(biāo)注在類上,抽取緩存相關(guān)注解的公共配置钦幔,可抽取的公共配置有緩存名字枕屉、主鍵生成 器等(如注解中的屬性所示)