
Spring Bean作用域差別
- 使用scope指定bean的作用于
屬性 | 介紹 |
---|---|
singleton | 預設值,當IOC容器一建立就會建立bean的執行個體, 是單例的,每次得到的都是同一個 |
propotype | 原型的,當IOC容器建立時不建立bean, 每次調用getBean方法時再執行個體化bean,而且不是同一個 |
request | 在web環境中使用,每次HTTP請求執行個體化一個bean |
session | 在web環境中使用,在一個HTTP Session會話中共享一個bean |
Spring常用資料事物傳播屬性和事務隔離級别
事物的屬性
Propagation:用來設定事物的傳播行為
- 傳播行為:一個方法運作在一個開啟事物的方法中,目前方法是使用原來的事務還是開啟一個新的事物
- Propagation.REQUIRED:預設值,使用原來的事物
- Propagation.REQUIRES_NEW:将原來的事物挂起,使用新的事物
事物的隔離級别
Isolation:用來設定事物的隔離級别
- Isolation.REPEATABLE_READ:可重複讀,MySql的預設隔離級别
- Isolation.READ_COMMITTED:讀已送出,Oracle的預設隔離級是
Spring的生命周期
- 執行個體化,初始init,接收請求service,銷毀destroy
- 執行個體化一個Bean,等同于new
- 按照Spring上下文對執行個體化的Bean進行配置,也就是IOC注入
- 如果這個Bean已經實作了BeanNameAware接口,會調用它實作的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值
- 如果這個Bean已經實作了BeanFactoryAware接口,會調用它實作的setBeanFactory(setBeanFactory(BeanFactory))傳遞的是Spring工廠自身(可以用這個方式來擷取其它Bean,隻需在Spring配置檔案中配置一個普通的Bean就可以)
- 如果這個Bean已經實作了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實作步驟4的内容,但比4更好,因為ApplicationContext是BeanFactory的子接口,有更多的實作方法)
- 如果這個Bean關聯了BeanPostProcessor接口,将會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean内容的更改,并且由于這個是在Bean初始化結束時調用那個的方法,也可以被應用于記憶體或緩存技術
如果Bean在Spring配置檔案中 配置了init-method屬性會自動調用其配置的初始化方法如果這個Bean關聯了 BeanPostProcessor接口,将會調用postProcessAfterInitialization(Object obj, String s)方法當Bean不再需要時,會經過清理階段,如果 Bean實作了DisposableBean這個接口,會調用那個其實作的destroy()方法最後,如果這個Bean的Spring配置中配置了destroy-method屬性, 會自動調用其配置的銷毀方法
@Autowired和@Resource差別
- @Autowired注解是按類型裝配依賴對象,預設情況下它要求依賴對象必須存在,如果允許null值,可以設定它required屬性為false
- @Resource注解是按名稱裝配,稱可以通過@Resource的name屬性指定
- @Resources按名字,是JDK的,@Autowired按類型,是Spring的
MyBatis資料庫字段名和屬性名不一緻解決
- 寫sql語句的時候起别名
- 在MyBatis的全局配置檔案中開啟駝峰命名
- 在Mapper檔案中使用resultMap自定義映射規則
MyBatis的一級緩存和二級緩存
- Mybatis的一級緩存首先去緩存中查詢結果集,作用域是一個SqlSession,如果沒有則查詢資料庫,如果有則從緩存取出傳回結果集就不走資料庫。
- Mybatis内部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句,value為從查詢出來映射生成的java對象
- Mybatis的二級緩存即查詢緩存,作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中擷取資料,二級緩存是可以跨SqlSession的
Git分支相關指令
建立分支
- git branch
- 檢視分支:git branch -v
切換分支
- git checkout
- 一步完成建立和切換分支:git checkout -b
合并分支
- 先切換到主幹:git checkout master
- git merge
删除分支
- 先切換到主幹:git checkout master
- git branch -D
工作流應用
git工作流
Redis持久化有幾種類型和差別
RDB
- 在指定的時間間隔内将記憶體中的資料集快照寫入磁盤,類似于Snapshot快照,恢複資料的時候是直接将快照直接讀到記憶體中
- 執行流程:Redis會單獨建立一個子程序來進行持久化,會先将資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案,RDB比AOF更高效,但最後一次持久化後的資料可能會丢失
- 優點:節省磁盤空間,恢複速度快
- 缺點:資料龐大時消耗性能
AOF
- 以日志的形式記錄每個寫操作,将Redis執行過的指令記錄下來,追加到檔案不改寫檔案,Redis重新開機後就根據日志的内容将寫指令從前到後執行一次恢複資料
- 優點:備份機制穩健,丢失資料機率低
- 缺點:比RDB更占用磁盤空間,恢複備份速度慢,存在個别Bug
Redis在項目中的使用場景
資料類型 | 使用場景 |
---|---|
String | 比如封鎖某個IP位址時可以使用 |
Hash | 存儲使用者資訊的時候 |
List | 實作最新消息的排行,可以模拟消息隊列 |
Set | 可以自動排重,求共同交集的時候使用 |
Zset | 進行排序的時候可以使用 |
MySQL索引
索引介紹
- 索引是資料結構
- 索引是幫助MySQL高效擷取資料的資料結構
- 索引是以索引檔案的形式存儲在磁盤上
那些情況需要索引
- 主鍵自動建立唯一索引
- 頻繁作為查詢條件的字段應該建立索引
- 查詢中于其他表關聯的字段,外鍵關系建立索引
- 組合索引比單鍵索引效率更高
- 查詢中排序的字段
- 查詢中統計或者分組的字段
那些情況不需要索引
- 表記錄太少
- 經常增删改的表或者字段
- Where條件裡用不到的字段
- 過濾性不好的不适合建索引
單點登入的實作過程
介紹
- 單點登入:一處登入多處使用
- 前提:單點登入多使用在分布式系統中
實作
單點登入的實作過程
購物車實作過程
使用者和購物車的關系
- 一個使用者必須對應一個購物車
- 單點登入操作在購物車之前
購物車操作
- 添加購物車
- 使用者未登入将資料添加到Redis或者Cookie中
- 使用者登入後用Hash存儲到Redis和資料庫中
展示購物車
- 未登入的時候直接從Redis或Cookie中展示資料
- 登入後,必須從資料庫和Redis和Cookie中展示購物車中的資料
消息隊列
弊端
- 容易出現消息的不确定性
- 可以使用延遲隊列和輪詢技術解決
END
往期推薦
- Java基礎面試題
- RocketMQ整合SpringBoot
- Solr整合SpringBoot
- WebSocket整合SpringBoot
- Java多線程