參數配置
YAML配置和properties配置相比有什麼區別
- 配置有序,在一些特殊的場景下,配置有序很關鍵
- 支持數組,數組中的元素能夠是基本數據類型也能夠是對象
- 簡潔
- 不支持 @PropertySource 註解導入,須要建立一個實現PropertySourceFactory接口的類
獲取配置文件中的參數有哪幾種方式
spring
spring框架的原理
spring框架的核心是IOC控制反轉和依賴注入。前端
- 什麼是控制反轉:一般一個對象要調用另一個對象必須將對方new出來,而後在使用完後銷燬掉,這就形成了對象之間的強耦合,而spring作的事情是將全部的對象註冊到bean factory中,若是一個對象要調用另一個直接從bean factory中取就好,對於一個對象而言,以前是它控制其餘對象的生命週期,而如今是spring 控制全部對象的生命週期,這就是控制的反轉(控制權上交)。
- 什麼是依賴注入:既然全部對象的生命週期都被spring控制了,那若是一個對象要調用其餘對象要怎麼辦呢,這就須要從spring中獲取這個對象而後注入到本身裏面來,這就是依賴注入。實現依賴注入的重要方法就是反射。
AOP和IOC原理
- IOC實現原理:一個bean有id,類型和屬性,首先須要定義一個bean的配置,spring讀取配置實例化bean寫到一個map中,map的key是bean id,value就是這個bean,若是有依賴其餘對象,則從map中獲取這個對象而後使用set方法set到bean屬性中,最後返回這個bean的實例。
- AOP:面向切面編程,在一個業務流程中有多個橫向關注點,好比權限驗證日誌打印,在aop中幾個重要概念:
- 鏈接點:指須要切入執行的方法
- 切入點:圍繞鏈接點的一種判斷表達式,判斷是否要執行
- 通知:通知有前置,後置,環繞,後置返回四種,當知足切入點時會發起通知
- Aop實現技術有aspectj和spring aop兩種,aspectj是編譯時加強,須要按照規範寫一個代理類加強業務類,而spring aop是動態代理實現,支持jdk代理和cglib代理,jdk動態代理是利用反射機制生成代理類鏈接點執行前執行的invokeHandler。
動態代理
動態代理是指經過類加載器和接口複製在具體方法執行時使用invokeHandler執行額外的操做。java
beanfactory和factory bean的區別
beanfactory是ioc容器,管理全部bean的生命週期,而factorybean是一個特殊的bean,它能夠生產某一個特定bean,一般用來封裝複雜bean的實例化過程。mysql
如何實現(保證)事務一致性完整性,spring中事務傳播機制類型
- REQUEST:方法必須在事務中執行,若是當前有事務則執行,若是沒有則啓動一個新的事務執行
- SUPPORT:若是當前有事務則在事務中執行,若是沒事務則以非事務執行
- REQUEST_NEW:方法必須在本身的事務中執行,每次啓動一個新的事務,兩個事務互不影響
- MANDATORY:方法必須在事務中執行,沒有事務則拋錯
- NOT_SUPPORT:方法老是非事務的執行,若是存在外層事務,則外層事務掛起,方法非事務的執行
- NEVER:方法老是非事務的執行,若是存在外層事務則拋錯
- NESTED:若是當前存在事務則掛起外層事務,啓動子的事務執行,子事務執行失敗會回到save點,外層事務回滾會影響子事務,子事務在外層事務commit時才commit
spring如何定義一個bean?代碼描述。Bean的生命週期?Bean的scope?
將bean註冊到spring有三種方法:使用@Component@Service註解,使用xml配置文件定義,基於java配置@bean。 首先是bean的實例化,而後調用set方法設置屬性,獲取上下文,執行關聯器的before方法,執行初始化bean接口的afterPropertiesSet方法,執行init方法,執行關聯器的after方法,bean完成,容器關閉,執行destroy方法。spring管理的bean默認都是單例的,非單例的bean會交給用戶本身管理面試
MVC相關
什麼是servlet,servlet生命週期
servlet是服務器端處理http請求小程序,當客戶端發起請求時,服務器接到請求併發送給servlet,當servlet第一次被訪問時執行實例化,並init初始化操做,servlet執行service方法生成響應內容後返回給服務端,服務端返回給客戶端,最後當servlet關閉時執行servlet的destory方法銷燬。redis
註解restcontroller和controller的區別
@RestController = @Controller + @ResponseBodyspring
一、若是使用@RestController註解controller,則controller中的方法沒法返回頁面,配置的視圖解析器InternalResourceViewResolver不起做用,返回的內容就是return的內容。sql
二、若是須要返回到指定頁面,須要使用@Controller註解controller數據庫
三、若是須要直接返回內容如json,則須要在方法前使用@ResponseBody編程
攔截器和過濾器的區別
過濾器實現Filter接口,攔截器實現HandlerInterceptor接口json
相同點:
- 都是aop編程思想的體現,能夠在程序執行先後作一些操做,如權限操做,日誌記錄等
不一樣點:
- Filter是Servlet規範中定義的,SpringMVC的機制是由DispaterServlet來分發請求給不一樣的Controller,攔截器是Spring框架中的
- 觸發時機不同,過濾器是在請求進入容器後,但請求進入servlet以前進行預處理的,過濾器在攔截器的外圍
- 攔截器能夠獲取IOC容器中的各個bean,而過濾器就不行,攔截器歸Spring管理
什麼時候使用攔截器?什麼時候使用過濾器?
- 若是是非spring項目,那麼攔截器不能用,只能使用過濾器。
- 若是是處理controller先後,既可使用攔截器也可使用過濾器。
- 若是是處理dispaterServlet先後,只能使用過濾器。
spring mvc框架
(1)首先瀏覽器發送請求——>DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制;
(2)DispatcherServlet——>HandlerMapping,處理器映射器將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器對象、多個HandlerInterceptor攔截器)對象;
(3)DispatcherServlet——>HandlerAdapter,處理器適配器將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持不少類型的處理器;
(4)HandlerAdapter——>調用處理器相應功能處理方法,並返回一個ModelAndView對象(包含模型數據、邏輯視圖名);
(5)ModelAndView對象(Model部分是業務對象返回的模型數據,View部分爲邏輯視圖名)——> ViewResolver, 視圖解析器將把邏輯視圖名解析爲具體的View;
(6)View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構;
(7)返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。
mybatis mysql
#{}和${}的區別
- {}直接替換成變量的值,不作任何轉換,這種是取值之後再去編譯SQL語句。
- #{}:預編譯處理,sql中的#{}替換成?,補全預編譯語句,調用PreparedStatement的set方法來賦值,有效的防止Sql語句注入,這種取值是編譯好SQL語句再取值。
CHAR和VARCHAR的區別
mybaits在處理char類型時會把字符串補齊長度再比較,若是數據庫中數據小於定義的char長度則會右側補齊空格,而varchar沒有這個問題。
like查詢的幾種方式
- like '%${xxx}%'
- like "%"#{xxx}"%"
- like concat('%',#{xxx},'%')
事務的概念,髒讀,如何定義一個事務,如何定義事務的隔離級別
- 事務是一個最小的完整業務工做單元,它具備原子性(事務不可分割),一致性(要求全部DML操做要麼同時成功要麼同時失敗),隔離性(不一樣的事務之間互不影響)和持久性(事務完結內存數據寫到磁盤)
- mybatis的事務管理是用sqlsession作的,打開一個session後事務開始直到session被commit;spring事務管理中將事務的實現交給jdbc,jta,自身封裝相同的api,要實現一個事務,可使用@transcational註解。
- 第一類更新丟失,指事務b回滾將事務a的修改也回滾了,這種是沒有隔離
- 髒讀的意思是讀取了未提交的數據,事務a讀取了事務b修改的數據,結果事務b回滾致使事務a中產生了髒數據。
- 不可重複讀的意思是同一個事務中不能讀取重複的數據,緣由是併發狀態同一個事務中可能先後兩次讀取的數據不一致。
- 第二類更新丟失,指事務b修改將事務a修改的數據覆蓋了。
- 幻讀和不可重複讀有點像,意思是同一個事務中先後兩次統計的條數不一致了。和不可重複度的區別是不可重複讀讀到的是別人修改的數據,而幻讀讀到的是別人新增的數據。
隔離級別
- 讀未提交:事務讀不鎖其餘事務寫也不鎖讀,事務寫只鎖其餘事務寫不鎖讀,能夠防止第一類更新丟失,對寫操做上持續排他鎖
- 讀已提交:事務讀不鎖其餘事務寫也不鎖讀,事務寫鎖其餘事務寫也鎖事務讀,能夠防止髒讀,對寫操做上持續排他鎖,對讀操做上臨時共享鎖
- 可重複讀:事務讀鎖其餘事務寫不鎖事務讀,事務寫鎖其餘事務寫也鎖事務讀,能夠防止不可重複讀,寫操做上持續排他鎖,讀操做上持續共享鎖(mysql默認隔離級別)
- 串行化:全部操做串行化,表鎖
鎖的級別
innodb 有讀鎖(共享鎖)和寫鎖(排他鎖),讀鎖時其餘事務只能讀不能寫,寫鎖時其餘事務不能讀也不能寫。innodb在檢索時若是不使用索引採起的是表級鎖,採用索引則是行級鎖,這是由於innodb是經過對索引項加鎖實現的行級鎖。另外innodb爲了解決幻讀問題採用了間隙鎖,當範圍查詢時會將不存在的id也鎖住防止新增數據。
redis相關
使用場景
- 計數器 數據統計的需求很是廣泛,經過原子遞增incr保持計數。因爲redis中存的是字符串,在遞增時會把字符串轉成十進制64位有符號整數計算。例如,點贊數、收藏數、分享數等。
- 鎖 setnx設置全局鎖
- 緩存 緩存一些熱點數據
- 消息隊列 經過list的pop及push接口進行隊列的寫入和消費
持久化機制
- redis支持兩種持久化機制
- 一種是rdb快照模式,將內存中的數據不斷寫入磁盤,優勢是能夠存儲大量數據,缺點是每次生成快照時主線程會fork一個子線程寫數據,會影響性能,另外若是忽然斷電數據還沒落盤則會丟失。
- 一種是aof日誌模式,記錄每次更新的日誌,這種方式詳細記錄了操做,彌補了rdb的一致性問題,可是aof文件記錄太多會致使恢復很慢。
redis memcache的區別
- memcache將數據所有放在內存中,斷電會丟失,而redis支持持久化存儲能夠將數據存在硬盤上
- redis支持的數據類型比memcache更豐富,在kv以外還支持如list,set,hash等
- memcache最大不能超過內存大小,而redis因爲能夠寫磁盤能夠突破內存大小
- 一般memcache僅用做數據庫前的一層內存緩存,適合多讀少寫的場景;而redis因爲支持更豐富的數據類型有更高的可靠性,能夠當成內存數據庫使用