面試來臨之際,就是你斬Offer之時!

他來了他來了,他帶着面經走來了!你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!
死鬼~看完記得給我來個三連哦!前端

本文主要介紹 面試中高頻出現的問題
若有須要,能夠參考
若有幫助,不忘 點贊 ❥
創做不易,白嫖無義!java

一丶Java基礎相關

1)面向對象的特性有哪些web

  • 封裝: 封裝是指將對象的實現細節隱藏起來,而後經過公共的方法來向外暴露出該對象的功能。使用封裝不只僅安全,並且能夠簡化操做。
  • 繼承: 繼承是面向對象實現軟件複用的重要手段,當子類繼承父類後,子類是一種特殊的父類,可以直接或間接得到父類裏的成員。缺點: 1.強耦合,父類變子類也得變 2.破壞了封裝性,實現細節對於子類都是透明的。
  • 多態: 同一個行爲具備多個不一樣表現形式或形態的能力。條件: 1. 繼承 2.重寫 3.向上轉型 好處: 能夠屏蔽不一樣子類對象之間的實現差別。
  • 抽象: 從特定的角度出發,從已經存在的一些事物中抽取咱們所關注的 特性,行爲,從而造成一個新的事物的思惟過程。是一種從複雜到簡潔的思惟方式。

2)Java中的覆蓋和重載面試

  • 覆蓋: 是指子類對父類方法的一種重寫。限制: 1.只能比父類拋出更少的異常 2.訪問權限不能比父類的小 3. 被覆蓋的方法不能是private 的。
  • 重載: 表示同一個類中能夠有多個名稱相同的方法。 條件: 1.參數類型不一樣 2.參數個數不一樣 3.參數順序不一樣. 注意: 函數的返回值不一樣不能構成重載

3)抽象類和接口的區別正則表達式

出發角度 抽象類 接口
默認的實現方法 有默認的方法實現 所有都是抽象的,不存在方法的實現
構造器 能夠有構造器 不能有構造器
訪問修飾符 能夠有public、protected和default這些修飾符 默認是public,不可使用其餘修飾符
繼承方式 能夠繼承一個類和實現多個接口 能夠繼承一個或多個接口
添加新方法 能夠提供默認的實現,而不須要修改原有的代碼 添加方法後,必須修改實現該接口類中的方法

4)Java 和 C++ 的區別spring

  • 都是面向對象的語言
  • Java不提供指針來直接訪問內存,比較安全
  • Java是單繼承的,C++能夠是多繼承的
  • Java有自動內存管理機制

5)Java 是值傳遞仍是引用傳遞
Java內都是值傳遞編程

  • 值傳遞: 是針對基本類型變量,傳遞的是該變量的一個副本,而改變副本不會改變原有值的改變。
  • 引用傳遞: 是針對對象型變量,傳遞的是該對象的引用地址,修改會引發原有對象的改變。

6)JDK、JRE、JVM設計模式

  • JDK: 是 Java開發工具包,是Java開發環境的核心組件,並提供編譯、調試和運行一個Java程序所須要的全部工具,能夠執行文件和二進制文件,是一個平臺特定的軟件。
  • JRE: 是Java 運行時環境,是JVM 的實施實現,提供了運行Java 程序的平臺,JRE 包含了 JVM,可是不包含 Java編譯器/調試器之類的開發工具。
  • JVM: 是Java虛擬機,當咱們運行一個程序時,JVM負責將字節碼轉換爲特定機器代碼,JVM提供了內存管理/垃圾回收和安全機制等。

7)Integer
數組


第一個和第二個的區別在於 Integer中存在緩存機制,JVM啓動初期會緩存 -128~127 這個區間裏面的全部數字,所以第一個位 true,第二個爲false。第三個爲 false 的緣由在於使用了 new 關鍵字開闢了新空間 , i 和 j 兩個對象分別指向堆中的兩塊內存空間。
8)String
  • 狀況1: 最多建立一個String 對象,最少不建立String 對象,若是常量池中存在"test",那麼str1會直接引用,此時不會建立對象,不然會在常量池中建立 "test" 內存空間,而後再引用。
  • 狀況2: 最多建立兩個String 對象,至少建立一個String 對象。new 關鍵字絕對會在堆空間中建立一個新的內存區域,因此至少會建立一個String對象。

9)Java 有沒有 goto
goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。
10)final 的做用緩存

  • 被 final 修飾的類不可被繼承
  • 被 final 修飾的方法不可被重寫
  • 被 final 修飾的變量不能夠被改變
  • 被final 修飾的方法,JVM會嘗試與其關聯,調高運行效率

11)final、finally和finalize的區別

  • final: 能夠修飾類、變量和方法。修飾類表示該類不能被繼承,修飾方法表示該方法不能被重寫,修飾變量表示該變量不可變。
  • finally: 通常做用在try-catch代碼塊中,在處理異常的時候,一般咱們將必定要執行的代碼方法放在finally代碼塊中,表示無論是否出現異常,該代碼塊都會執行,通常用來存放一些關閉資源的代碼。
  • finalize: 是一個屬於Object 類的方法,Object是全部類的父類,Java中容許使用finalize()方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。

12)Throwable
Throwable 是Java語言中全部錯誤與異常的超類。包含兩個子類:

  • Error(錯誤)
    程序中沒法處理的錯誤,表示運行應用程序中出現了嚴重的錯誤
  • Exception(異常)
    程序自己能夠捕獲而且能夠處理的異常
  • 運行時異常
    Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常時,假若既「沒有經過throws聲明拋出它」,也「沒有用try-catch語句捕獲它」,仍是會經過編譯。
  • 編譯時異常
    Java編譯器會檢查它,若是程序中出現此類異常,要麼經過throws進行聲明拋出,要麼經過try-catch進行捕獲處理,不然不能經過編譯。

13)常見的運行時異常

  • NullPointException(空指針異常)
  • ClassNotCastException(類型轉換異常)
  • IllegalArgumentException(非法參數異常)
  • IndexOutOfBoundException(下標越界異常)
  • ArrayStoreException(數組存儲空間不夠異常)

14)try-catch-finally中哪一個部分能夠省略
catch能夠省略

二丶集合容器相關

集合這方面能夠問的實在太多了,這一塊可要好好把握住!


1)集合的種類
Map接口和Collection接口是全部集合框架的父接口

  • Collection:
  • List接口
    • ArrayList
    • LinkedList
    • Stack
    • Vector
  • Set接口
    • HashSet
    • TreeSet
    • LinkedHashSet
  • Map:
  • HashMap
  • TreeMap
  • Hashtable
  • ConcurrentHashMap
  • Properties

2)List 和 Set 的區別
List: 有序(元素存入集合的順序和取出的順序是一致的),能夠重複,能夠插入多個null元素,元素都有索引。
Set: 無序(元素存入集合的順序和取出的順序有可能不一致),不能夠重複,只容許存入一個null元素(元素的惟一性)
擴展: HashSet的底層實現
  • HashSet實現Set接口,其實是一個HashMap 實例支持。
  • 它不保證set 的迭代順序,特別是它不保證該順序恆久不變,此類容許使用null元素。
  • 元素都存到HashMap鍵值對的Key上面,而Value是一個統一的值

3)Array 和 ArrayList 的區別

  • 數組是固定長度的,集合是可變長度的
  • 數組能夠存儲基本數據類型也能夠引用數據類型,集合只能存儲引用數據類型
  • 數組存儲的元素必須是用一個數據類型,集合存儲的對象能夠是不一樣數據類型

4)HashMap 和 HashTable的區別

  • HashMap 繼承自 AbstractMap 類;而 Hashtable 繼承自 Dictionary
  • HashTable 是線程安全的,直接在方法上鎖,併發度很低,雖多同時容許一個線程訪問。相反HashMap效率比較高,但線程不安全
  • HashTable 是不容許鍵或值爲null的,HashMap的鍵值都能夠是null,緣由在於HashTable使用的是安全失敗機制(fail-fast),若是鍵或值爲空會直接拋出異常;而HashMap在計算hash值的時候作了特殊處理若是鍵爲空則賦值爲0
  • HashTable初始化的容量爲11,HashMap初始化的容量爲16。二者的負載因子都是0.75
  • HashTable的擴容機制是2n+1, HashMap的擴容機制是 2n

擴展: 何爲fail-fast

  • fail-fast 是一種錯誤檢測機制,併發狀況下多個線程對集合的結構進行修改是就會觸發 fail-fast機制,拋出 ConcurrentModificationException異常。
  • 原理: 迭代器在遍歷時直接訪問集合中的內容,而且在遍歷過程當中使用一個 modCount 變量,遍歷期間集合若是發生變化就會改變modCount的值,等下一個hasNext()/next()的時候就會比對 modCount != expectedModCount 這個判斷條件,若是爲true則會拋出異常,終止遍歷,不然就返回遍歷。

5)聊聊HashMap

  • Java 1.8以前HashMap 是由 數組+鏈表 組合構成的數據結構。數組的長度是有限的,所以哈希會存在碰撞的狀況,那麼就會造成鏈表。若是鏈表長度過長就會形成查詢效率過慢,時間複雜度爲O(n)。
  • Java 1.8 以前採用的是 頭插法,就是說新插入的值的時候,原來的值就會日後推一位,讓新值放在頭部位置,這樣作的緣由是由於後插入的值查找的可能性會更大一點,提升查找的效率。可是這樣就會形成一個問題,在同一個位置上新元素總會被放在鏈表的頭部位置,若是多線程put的狀況下,就會改變數據的引用結構,那麼就會形成環形鏈表,發生死循環!
  • Java 1.8 以後數據結構就變成了 數組+鏈表+紅黑樹。 當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減小了查找時間。
  • Java 1.8 以後採用的是 尾插法,這樣擴容轉移後先後鏈表順序不變,保持以前節點的引用關係,就不會出現死循環的狀況。

6)HashMap擴容是怎樣擴容的
當HashMap中的元素個數超過數組大小(數組總大小length,不是數組中個數size)*loadFactor時,就會進行數組擴容,loadFactor的默認值爲0.75.HashMap不是無限擴容的,當達到了實現預約的MAXIMUM_CAPACITY,就再也不進行擴容。


7)HashMap 的長度爲何都是2的N次冪的大小

  • 不會形成浪費,不隨機分佈問題。首先算得key得hashcode值,而後跟數組的長度-1作一次「與」運算(&)。若是length不爲2的冪,那麼length-1的2進制就會變成1110,在h爲隨機數的狀況下,和1110作&操作,尾數永遠是0,碰撞的概率大。
  • 提升性能。length爲2的冪,那麼擴容後元素新的位置就不須要從新計算,只須要看看當前值的hash&(擴容後的容量-1)是1仍是0就行了,是0的話索引沒變,是1的話索引變成「原索引+oldCap」

8)HashMap存在線程安全問題,那是怎麼處理這種狀況的?

  • 使用 Collections.synchronizedMap(new HashMap<>())
  • HashTable
  • ConcurrentHashMap

出於線程併發度的考慮,通常會選擇ConcurrentHashMap,他的性能和效率都明顯高於前二者

9)ConcurrentHashMap

  • Java 1.8 以前ConcurrentHashMap底層使用的是 數組+鏈表

    由圖得知,底層的數據結構是由 Segment 數組HashEntry組成,和HashMap同樣,仍然是數據加鏈表的形式。HashEntry 和 HashMap 差很少,不一樣點是使用了 Volatile 修飾了 Value,在訪問數據的時候不用加鎖,只能保證了弱一致性。
  • ConcurrentHashMap 採用了 分段鎖 技術,其中 Segment 繼承於 ReentrantLock。不會像HashTable 那樣直接在方法上加鎖,太簡單粗暴了…,若是容量大小是16,那個他的併發度就是16,至關於效率提升了16倍。

  • Java 1.8以後 ConcurrentHashMap 採用的是 Node + CAS + Synchronized 來保證併發安全性的,而且也引入了紅黑樹。跟HashMap的實現是同樣的,當鏈表長度大於 7 的時候轉換爲紅黑數。
  • ConcurrentHashMap 進行 put 的步驟:
  • 若是相應位置的Node尚未初始化,則調用CAS插入相應的數據
  • 若是相應位置的Node不爲空,則對該節點加synchronized鎖,遍歷鏈表更新節點或插入新節點
  • 若是該節點是TreeBin類型的節點,說明是紅黑樹結構,則經過putTreeVal方法往紅黑樹中插入節點;若是binCount不爲0,說明put操做對數據產生了影響,若是當前鏈表的個數達到8個,則經過treeifyBin方法轉化爲紅黑樹,若是oldVal不爲空,說明是一次更新操做,沒有對元素個數產生影響,則直接返回舊值

10)迭代器 Iterator
Iterator 接口提供遍歷任何 Collection 的接口。咱們能夠從一個 Collection 中使用迭代器方法來獲取迭代器實例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器容許調用者在迭代過程當中移除元素。
11)Iterator 和 ListIterator 的區別

  • Iterator 能夠遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List。
  • Iterator 只能單向遍歷,而 ListIterator 能夠雙向遍歷(向前/後遍歷)。
  • ListIterator 實現 Iterator 接口,而後添加了一些額外的功能,好比添加一個元素、替換一個元素、獲取前面或後面元素的索引位置。

12)實現數組和 List 之間的轉換

  • 數組轉 List:使用 Arrays. asList(array)
  • List 轉數組:使用 List 自帶的 toArray()

13)ArrayList 和 LinkedList 的區別

  • ArrayList 底層是動態數組數據結構,LinkedList 底層是雙向鏈表數據結構。
  • ArrayList 比 LinkedList 在隨機訪問的時候效率要高,由於 LinkedList 是線性的數據存儲方式,因此須要移動指針從前日後依次查找。
  • 在非首尾的增長和刪除操做,LinkedList 要比 ArrayList 效率要高,由於 ArrayList 增刪操做要影響數組內的其餘數據的下標。
  • LinkedList 比 ArrayList 更佔內存,由於 LinkedList 的節點除了存儲數據,還存儲了兩個引用,一個指向前一個元素,一個指向後一個元素。

14)ArrayList 和 Vector的區別

  • Vector 使用了 Synchronized 來實現線程同步,是線程安全的,而 ArrayList 是非線程安全的。
  • ArrayList 在性能方面要優於 Vector。
  • ArrayList 和 Vector 都會根據實際的須要動態的調整容量,只不過在 Vector 擴容每次會增長 1 倍,而 ArrayList 只會增長 50%。

15)hashCode()與equals()的相關規定

  • 兩個對象相等,那麼他們的hashCode也必定是相同的
  • 兩個對象相等,那麼equals方法返回的是true
  • 兩個對象有相同的hashCode值,那他們也不必定相等
  • 若是重寫了equals,那麼它們的hashCode方法也必須被重寫

16)極高併發下HashTable和ConcurrentHashMap哪一個性能更好,爲何

  • HashTable使用一把鎖處理併發問題,當有多個線程訪問時,須要多個線程競爭一把鎖,致使阻塞
  • ConcurrentHashMap則使用分段,至關於把一個HashMap分紅多個,而後每一個部分分配一把鎖,這樣就能夠支持多線程訪問

17)HashMap在高併發下若是沒有處理線程安全會有怎樣的安全隱患

  • 多線程put時可能會致使get無限循環,具體表現爲CPU使用率100%
  • 多線程put時可能致使元素丟失

18)BlockingQueue是什麼
BlockingQueue是JUC包下的,是一個阻塞隊列,在進行檢索或移除一個元素的時候,它會等待隊列變爲非空;當在添加一個元素時,它會等待隊列中的可用空間。BlockingQueue接口是Java集合框架的一部分,主要用於實現生產者-消費者模式。咱們不須要擔憂等待生產者有可用的空間,或消費者有可用的對象,由於它都在BlockingQueue的實現類中被處理了。Java提供了集中BlockingQueue的實現,好比ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue等。

19)ArrayList在循環過程當中刪除,會不會出問題,爲何。
會出現問題。由於刪除是利用複製和移動的方式,若是集合的值爲{"11","22","22"},要刪除22的話結果爲{"11","22"},第三個22就會前移,這樣能循環過程當中,就訪問不到第三個22。
解決:

  • 反向刪除
  • 利用迭代器刪除(多線程會報錯)

3、Spring相關

1)什麼是Spring

  • 是Java企業級應用的開源開發框架
  • 簡化Java企業級應用開發,提升開發效率
  • 基於POJO爲基礎的編程模型促進良好的編程習慣

2)Spring的優缺點
優勢:

  • 輕量級: Spring從大小和透明度來講都是輕量級的
  • 控制反轉(IOC): Spring經過控制反轉實現了鬆散耦合,對象給出它們的依賴,而不是經過建立或查找依賴的對象
  • 面向切面(AOP): 支持面向切面的編程,實現應用業務邏輯和系統服務相分開
  • 容器: Spring包含和管理應用中對象的生命週期和配置
  • 聲明式事務管理: 只須要經過配置就能夠對事務進行管理,無需手動編程

缺點:

  • Spring 依賴反射,會影響性能
  • 使用門檻升高,入門Spring須要較長的時間

3)Spring的核心模塊

  • Spring core
  • Spring context
  • Spring bean
  • Spring orm
  • Spring aop
  • Spring web
  • Spring jdbc
  • Spring test

4)什麼是Spring配置文件
Spring配置文件是XML 文件。該文件主要包含類信息,它描述了這些類是如何配置以及相互引入的。可是XML配置文件冗長且更加乾淨,若是沒有正確規劃和編寫,那麼在大項目中管理會變得很是困難。

5)Spring框架中用到的設計模式

  • 工廠模式: BeanFactory 就是簡單工廠模式的體現,用來建立對象的示例
  • 單例模式: Bean默認爲單例模式
  • 代理模式: Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術
  • 模板方法: 用來解決代碼重複問題。好比RestTemplate,JmsTemplate,JpaTemplate
  • 觀察者模式: 當一個對象的狀態發生改變時,全部依賴於它的對象都會獲得通知並更新

6)IOC是什麼
IOC(控制反轉),它把傳統上由程序代碼直接操控的對象的調用權交給容器,經過容器來實現對象組件的裝配和管理。所謂「控制反轉」概念就是對組件對象控制權的轉移,從程序代碼自己轉移到了外部容器。Spring IOC負責建立對象,管理對象(經過依賴注入(DI)裝配對象,配置對象,而且管理這些對象的整個生命週期)

7)IOC的優勢

  • IOC 或 依賴注入把應用的代碼量降到最低。
  • 它使應用容易測試,單元測試再也不須要單例和JNDI查找機制。
  • 最小的代價和最小的侵入性使鬆散耦合得以實現。
  • IOC容器支持加載服務時的餓漢式初始化和懶加載。

8)動態代理的兩種方式以及區別

  • JDK動態代理: 利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。若是被代理的類沒有實現接口則沒法實現。
  • CGlib動態代理: 針對類實現代理,對指定的類生成一個子類,並覆蓋其中的方法,這種經過繼承類的實現方式,不能代理final修飾的類。

jdk動態代理的方式建立代理對象效率較高,執行效率較低,cglib建立效率較低,執行效率高

9)能夠經過多少種方法完成依賴注入

  • 構造函數注入
  • setter 注入
  • 接口注入
構造函數注入 setter注入
沒有部分注入 有部分注入
不會覆蓋setter屬性 會覆蓋setter屬性
任意修改都會建立一個新實例 任意修改不會建立一個新實例
適用於設置不少屬性 適用於設置少許屬性

10)BeanFactory 和 ApplicationContext 的區別

BEANFactory ApplicationContext
懶加載 即時加載
不支持國際化 支持國際化
不支持基於依賴的註解 支持基於依賴的註解

11)ApplicationContext一般的實現是什麼

  • FileSystemXmlApplicationContext
  • ClassPathXmlApplicationContext
  • WebXmlApplicationContext

12)Spring 支持的做用域

  • singleton: bean在每一個Spring ioc 容器中只有一個實例。
  • prototype: 一個bean的定義能夠有多個實例。
  • request: 每次http請求都會建立一個bean,該做用域僅在基於web的Spring ApplicationContext情形下有效。
  • session: 在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
  • global-session: 在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。

13)spring 自動裝配 bean 有哪些方式

  • no: 默認的方式是不進行自動裝配的,經過手工設置ref屬性來進行裝配bean
  • byName 經過bean的名稱進行自動裝配,若是一個bean的 property 與另外一bean 的name 相同,就進行自動裝配
  • byType: 經過參數的數據類型進行自動裝配
  • constructor: 利用構造函數進行裝配,而且構造函數的參數經過byType進行裝配
  • autodetect: 自動探測,若是有構造方法,經過 construct的方式自動裝配,不然使用 byType的方式自動裝配

14)怎樣開啓註解裝配
在Spring配置文件中配置 <context:annotation-config/>元素

15)@Autowired 和 @Resource 的區別

  • @Autowired: 可用於構造函數、成員變量、Setter方法。默認是按照類型裝配注入的,默認狀況下它要求依賴對象必須存在(能夠設置它required屬性爲false)
  • @Resource: 默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean纔會按照類型來裝配注入

16)spring 事務實現方式有哪些

  • 編程式事務管理: 你能夠經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。
  • 聲明式事務管理: 你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。

17)Spring的事務傳播行爲

  • REQUIRED: 支持當前事務,當前存在事務就加入該事務,若是當前沒有事務就建立一個事務
  • SUPPORTS: 支持當前事務,當前存在事務就加入該事務,若是當前沒有事務就以非事務執行
  • MANDATORY: 支持當前事務,當前存在事務就加入該事務,若是當前沒有事務就拋出異常
  • REQUIRES_NEW: 新建事務,不管當前有沒有存在事務都會建立新事務
  • NOT_SUPPORTED: 以非事務方式執行,若是當前存在事務就把當前事務掛起
  • NEVER: 以非事務方式執行,若是當前存在事務就拋出異常
  • NESTED: 若是當前存在事務,則在嵌套事務內執行,若是當前沒有事務,則按REQUIRED屬性執行

18)spring 的事務隔離

  • READ_UNCOMMITTED: 未提交讀,最低隔離級別,事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀)
  • READ_COMMITTED: 提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀),SQL Server的默認級別
  • REPEATABLE_READ: 可重複讀,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致的,禁止讀取別的事務未提交的數據(會形成幻讀),MySQL的默認級別
  • SERIALIZABLE: 序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀,不可重複讀,幻讀

髒讀: 表示一個事務可以讀取另外一個事務中還未提交的數據,好比:某個事務嘗試插入記錄A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄A
不可重複讀: 是指一個事務內,屢次讀同一個數據,可是讀出來的結果是不同的
幻讀: 指同一個事務內屢次查詢返回的結果集不同,好比:另一個事務新增或刪除第一個事務結果集裏面的數據,同一個記錄的數據內容別修改了,全部數據行的記錄就變多或者變少了。
不可重複讀通常是在修改數據的狀況下,幻讀通常是新增或者刪除的狀況下

19)Spring AOP and AspectJ AOP 有什麼區別

  • Spring AOP 是爲動態代理,AspectJ是爲靜態代理
  • Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改字節碼,而是每次運行時在內存中臨時爲方法生成一個AOP對象,這個AOP對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法。
  • AspectJ是靜態代理的加強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,所以也稱爲編譯時加強,他會在編譯階段將AspectJ(切面)織入到Java字節碼中,運行的時候就是加強以後的AOP對象。

20)Spring AOP裏面的幾個名詞

  • 切面(Aspect): 切面是通知和切點的結合。通知和切點共同定義了切面的所有內容。 在Spring AOP中,切面可使用通用類(基於模式的風格) 或者在普通類中以 @AspectJ 註解來實現。
  • 鏈接點(Join point): 指方法,在Spring AOP中,一個鏈接點 老是 表明一個方法的執行。 應用可能有數以千計的時機應用通知。這些時機被稱爲鏈接點。鏈接點是在應用執行過程當中可以插入切面的一個點。這個點能夠是調用方法時、拋出異常時、甚至修改一個字段時。切面代碼能夠利用這些點插入到應用的正常流程之中,並添加新的行爲。
  • 通知(Advice): 在AOP術語中,切面的工做被稱爲通知。
  • 切入點(Pointcut): 切點的定義會匹配通知所要織入的一個或多個鏈接點。咱們一般使用明確的類和方法名稱,或是利用正則表達式定義所匹配的類和方法名稱來指定這些切點。
  • 引入(Introduction): 引入容許咱們向現有類添加新方法或屬性。
  • 目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。它一般是一個代理對象。也有人把它叫作 被通知(adviced) 對象。 既然Spring AOP是經過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。
  • 織入(Weaving): 織入是把切面應用到目標對象並建立新的代理對象的過程。在目標對象的生命週期裏有多少個點能夠進行織入:
  • 編譯期:切面在目標類編譯時被織入。AspectJ的織入編譯器是以這種方式織入切面的。
  • 類加載期:切面在目標類加載到JVM時被織入。須要特殊的類加載器,它能夠在目標類被引入應用以前加強該目標類的字節碼。AspectJ5的加載時織入就支持以這種方式織入切面。
  • 運行期:切面在應用運行的某個時刻被織入。通常狀況下,在織入切面時,AOP容器會爲目標對象動態地建立一個代理對象。SpringAOP就是以這種方式織入切面。

21)Spring通知有哪些類型

  • 前置通知(Before): 在目標方法被調用以前調用通知功能;
  • 後置通知(After): 在目標方法完成以後調用通知,此時不會關心方法的輸出是什麼;
  • 返回通知(After-returning ): 在目標方法成功執行以後調用通知;
  • 異常通知(After-throwing): 在目標方法拋出異常後調用通知;
  • 環繞通知(Around): 通知包裹了被通知的方法,在被通知的方法調用以前和調用以後執行自定義的行爲。

22)spring bean 容器的生命週期是什麼樣的

  • Spring 容器根據配置中的 bean 定義中實例化 bean。
  • Spring 使用依賴注入填充全部屬性,如 bean 中所定義的配置。
  • 若是 bean 實現 BeanNameAware 接口,則工廠經過傳遞 bean 的 ID 來調用 setBeanName()。
  • 若是 bean 實現 BeanFactoryAware 接口,工廠經過傳遞自身的實例來調用 setBeanFactory()。
  • 若是存在與 bean 關聯的任何 BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。
  • 若是爲 bean 指定了 init 方法( 的 init-method 屬性),那麼將調用它。
  • 最後,若是存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。
  • 若是 bean 實現 DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。
  • 若是爲 bean 指定了 destroy 方法( 的 destroy-method 屬性),那麼將調用它。

23) DispatcherServlet 的工做流程

  1. 用戶發請求-->DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制。
  2. DispatcherServlet-->HandlerMapping,HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器,多個HandlerInterceptor攔截器)。
  3. DispatcherServlet-->HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器。
  4. HandlerAdapter-->處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理,並返回一個ModelAndView對象(包含模型數據,邏輯視圖名)
  5. ModelAndView的邏輯視圖名-->ViewResolver,ViewResoler將把邏輯視圖名解析爲具體的View。
  6. View-->渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構
  7. 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶。
看完不讚,都是壞蛋
看完不讚,都是壞蛋

本文較長,覆蓋範圍較廣,但深度不深,所以先縱覽斬offer,再融會而貫通
今天的你多努力一點,明天的你就能少說一句求人的話!
好久好久以前,有個傳說,聽說:
看完不讚,都是壞蛋

相關文章
相關標籤/搜索