一. 單例bean
Spring框架中的單例bean是線程安全的嗎?
?????????Spring框架中的bean是單例的,可以在注解@Scope()進行設置
?
- ?singleton:bean在每一個Spring IOC容器中只有一個實例。
- prototype:一個bean的定義可以有多個實例
總結
二. AOP
? ? ? ? AOP稱為面向切面編程,用于將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。
? ? ? ? 以下詳細說明一下AOP的使用場景
2.1 記錄操作日志
? ? ? ? 當用戶請求時,需要記錄請求中的請求方式、訪問地址等信息,
代碼分析如下:
2.2 Spring中的事務是如何實現的
Spring支持編程式事務管理和聲明式事務管理兩種方式。
- 編程式事務控制:需使用TransactionTemplate來進行實現,對業務代碼有侵入性,項目中很少使用
- 聲明式事務管理:聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
? ? ? ? ?在業務邏輯之前開啟事務,在業務邏輯執行之后提交事務,如果出現異常,則進行回滾,要在方法前面加上注解@Transactional
總結
三. 事務失效
有三種事務失效的場景
- 異常捕獲處理
- 拋出檢查異常
- 非public方法
3.1 異常捕獲處理
? ? ? ? 事務通知只有捉到了目標拋出的異常,才能進行后續的回滾處理,如果目標自己處理掉異常,事務通知無法知悉
? ? ? ? 解決方法是在catch塊中添加throw new RuntimeException(e)拋出
3.2 拋出檢查異常
原因是Spring默認只會回滾非檢查異常
解決方法是配置rollbackFor屬性@Transactional(rollbackFor=Exception.class)
3.3 非public方法導致的事務失效
總結
Spring中事務失效的場景有以下幾種:
1.異常捕獲處理,自己處理了異常,沒有拋出,解決方法是手動拋出
2.拋出檢查異常,配置rollbackFor屬性為Exception
3.非public方法導致的事務失效,改為public
四. Spring的bean的生命周期
4.1 BeanDefinition
? ? ? ? Spring容器在進行實例化時,會將xml配置的<bean>的信息封裝成一個BeanDefinition對象,Spring根據BeanDefinition來創建Bean對象,里面有很多的屬性用來描述Bean
總結
五. Spring循環引用
循環引用可能出現死循環現象
5.1 三級緩存解決循環依賴
一級緩存作用:限制bean在beanFactory中只存一份,即實現singleton scope,解決不了循環依賴
二級緩存
三級緩存
5.2 構造方法出現了循環依賴怎么解決
總結
六. SpringMvc執行流程
SpringMvc的執行流程是這個框架最核心的內容
- 視圖階段(老舊JSP等)
- 前后端分離階段(接口開發、異步)
6.1?視圖階段(JSP)
?
?6.2?前后端分離階段(接口開發、異步)
?總結
?
?七. SpringBoot自動配置原理
- @SpringBootConfiguration:該注解與@Configuration注解作用相同,用來聲明當前也是一個配置類
- @ComponentScan:組件掃描,默認掃描當前引導類所在包及其子包
- @EnableAutoConfiguration:SpringBoot實現自動化配置的核心注解。
@EnableAutoConfiguration注解分析如下
?總結
?
?八. Spring框架常見注解(Spring、SpringBoot、SpringMvc)
8.1 Spring的常見注解
Spring的常見注解有哪些?
回答參照下表:
8.2?SpringBoot的常見注解
SpringBoot的常見注解有哪些?
回答參照下表:
8.3?SpringMvc的常見注解
SpringMvc的常見注解有哪些?
回答參照下表:
八. Mybatis執行流程
Mybatis執行流程
首先要定義核心配置文件mybatis-config.xml,作用一是加載環境配置,二是加載映射文件
操作數據庫
總結
Mybatis執行流程是?
九.?Mybatis延遲加載
Mybatis是否支持延遲加載?
9.1 什么是延遲加載
9.1 延遲加載的原理
- 使用CGLIB創建目標對象的代理對象
- 當調用目標方法user.getOrderList()時,進入攔截器invoke方法,發下user.getOrderList()是null值,執行sql查詢order列表
- 把order查詢上來,然后調用user.setOrderList(List<Order> orderList),接著完成user.getOrderList()方法的調用
總結
十. Mybatis一級二級緩存
Mybatis的一級,二級緩存用過嗎?
10.1 一級緩存
? ? ? ? 基于PerpetualCache的HashMap本地緩存,其存儲作用域為Session,當Session進行flush或close之后,該Session中的所有Cache就將清空,默認打開一級緩存
10.2?二級緩存
? ? ? ? 基于namespace和mapper的作用域起作用的,不是依賴于SQL session,默認也是采用PerpetualCache,HashMap存儲
二級緩存默認是關閉的
開啟方式,兩步走:
1. 全局配置文件
2.映射文件
使用<cache/>標簽讓當前mapper生效二級緩存
?注意事項: