框架篇
Spring框架中的bean不是線程安全的
@Scope()
singleton單例
prototype多例
一個類中有可修改的成員變量需要考慮線程安全
bean沒有可變狀態(service類,DAO類)
某種程度單例bean是線程安全的
AOP面向切面編程,抽取公共行為和邏輯,封裝成可重用的模塊(切面)
記錄操作日志
緩存處理
Spring中內置的事務處理
常用環繞通知
@Around(切面類)
Spring
編程式事務控制:TransactionTemplate 對業務代碼侵入 不常用
聲明式事務管理:@Transaction
本質通過AOP對方法前后進行攔截
在方法開始前加入一個事務
在執行完目標方法之后根據執行情況提交或者回滾事務
事務失效的場景
異常捕獲處理
try catch
目標自己處理掉異常,事務通知無法獲悉
在catch塊中添加RuntimeException拋出
拋出檢查異常
Spring默認只會回滾非檢查異常
在注解里面配置rollbackFor屬性
非public方法
事務通知前提是方法是public
bean的生命周期
BeanDefinition
Spring容器進行實例化,xml配置的<bean>的信息封裝成BeanDefinition對象
1.構造函數:實例化Bean
Bean的創建和初始化賦值是分開的
2.依賴注入
3.Aware接口
4.Bean前置處理器
5.初始化方法:InitializingBean 自定義init方法
6.Bean后置處理器 AOP 動態代理
7.銷毀Bean
三級緩存解決Spring中的循環引用(依賴注入出問題)
一級緩存:單例池,初始化完成的bean
二級緩存:緩存早期的bean對象(生命周期沒有走完)
三級緩存:對象工廠,用來創建對象(代理對象)
spring框架依據三級緩存已經解決了大部分的循環依賴
構造方法循環依賴問題
在注入的參數前加@lazy注解
SpringMVC執行流程
視圖階段(老舊JSP)
1.請求到前端控制器
2.前端控制器調用處理器映射器
3.處理器映射器找到具體處理器,生成處理器對象以及處理器攔截器,返回給前端控制器
4.處理器前端控制器調用處理器適配器
5.處理器適配器適配到具體處理器
6.controller執行完返回ModeAndView給處理器適配器
7.處理器適配器將ModeAndView返回給前端控制器
8.前端控制器將ModeAndView傳給視圖解析器
9.視圖解析器解析后返回具體的視圖
10.前端控制器根據視圖進行渲染
11.響應用戶
前后端分離階段(接口開發,異步)
1.請求到前端控制器
2.前端控制器調用處理器映射器
3.處理器映射器找到具體處理器,生成處理器對象以及處理器攔截器,返回給前端控制器
4.處理器前端控制器調用處理器適配器
5.處理器適配器適配到具體處理器
6.方法添加@ResponseBody
7.通過HttpMessageConverter返回結果轉換為JSON并響應
Springboot自動配置原理
@SpringBootApplication包含三個注解
@SpringBootConfiguration 與@Configuration注解作用相同,配置類
@ComponentScan 組件掃描 默認引導類所在包及其子包
@EnableAutoConfiguration 實現自動化配置的核心注解
該注解通過@import注解導入對應的配置選擇器
讀取該項目和該項目引用的jar包的classpath路徑下
META-INF/spring.factories文件中所配置的全類名
根據條件注解所指定的條件決定是否導入Spring容器中
@ConditionalOnClass 判斷是否有對應的class文件
Mybatis執行流程
1.讀取配置文件
2.創建會話工廠SqlSessionFactory
3.會話工廠創建SqlSession對象(包含執行sql語句的所有方法)
4.操作數據庫的接口,Executor執行器,同時負責查詢緩存的維護
5.Executor接口執行方法中有一個MappedStatement類型的參數,封裝了映射信息
6.輸入參數映射
7.輸出結果映射
Mybatis支持延時加載,默認沒有開啟
原理:
1.使用CGLIB創建目標對象的代理對象
2.調用目標方法時,進入攔截器invoke方法,發現目標方法為null值,執行sql查詢
3.獲取數據后,調用set方法設置屬性值,再繼續查詢目標方法,就有值
本地緩存:本質是一個HashMap
一級緩存:作用域是session級別
二級緩存:作用域是namespace和mapper的作用域,不依賴session
一級緩存:HashMap本地存儲,Session進行flush或close,Session中所有的Cache清空
默認打開一級緩存
二級緩存:HashMap存儲,不依賴于SQL session 默認關閉二級緩存
全局配置文件
映射文件<cache/>
1.數據更新機制:某一個作用域(一級緩存Session/二級緩存Namespace)進行新增、
修改、刪除操作后,默認該作用域下的所有select中的緩存被clear
2.二級緩存需要緩存的數據實現Serializable
3.只有會話提交或者關閉之后,一級緩存中的數據才會轉移到二級緩存中