1)面向對象的特性有哪些
前端
封裝: 封裝是指將對象的實現細節隱藏起來,而後經過公共的方法來向外暴露出該對象的功能。使用封裝不只僅安全,並且能夠簡化操做。web
繼承: 繼承是面向對象實現軟件複用的重要手段,當子類繼承父類後,子類是一種特殊的父類,可以直接或間接得到父類裏的成員。正則表達式
缺點:spring
1.
強耦合,父類變子類也得變編程
2.
破壞了封裝性,實現細節對於子類都是透明的。設計模式
多態: 同一個行爲具備多個不一樣表現形式或形態的能力。數組
條件:緩存
1.
繼承安全
2.
重寫session
3.
向上轉型
好處:能夠屏蔽不一樣子類對象之間的實現差別。
抽象: 從特定的角度出發,從已經存在的一些事物中抽取咱們所關注的 特性,行爲,從而造成一個新的事物的思惟過程。是一種從複雜到簡潔的思惟方式。
2)Java中的覆蓋和重載
覆蓋: 是指子類對父類方法的一種重寫。
限制:
1.
只能比父類拋出更少的異常
2.
訪問權限不能比父類的小
3.
被覆蓋的方法不能是private 的。
重載: 表示同一個類中能夠有多個名稱相同的方法。
條件:1.
參數類型不一樣 2.
參數個數不一樣 3.
參數順序不一樣
注意:函數的返回值不一樣不能構成重載
3)抽象類和接口的區別
出發角度 | 抽象類 | 接口 |
---|---|---|
默認的實現方法 | 有默認的方法實現 | 所有都是抽象的,不存在方法的實現 |
構造器 | 能夠有構造器 | 不能有構造器 |
訪問修飾符 | 能夠有public、protected和default這些修飾符 | 默認是public,不可使用其餘修飾符 |
繼承方式 | 能夠繼承一個類和實現多個接口 | 能夠繼承一個或多個接口 |
添加新方法 | 能夠提供默認的實現,而不須要修改原有的代碼 | 添加方法後,必須修改實現該接口類中的方法 |
4)Java 和 C++ 的區別
都是面向對象的語言
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的實現,好比ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等。
19)ArrayList在循環過程當中刪除,會不會出問題,爲何。
會出現問題。由於刪除是利用複製和移動的方式,若是集合的值爲{"11","22","22"},要刪除22的話結果爲{"11","22"},第三個22就會前移,這樣能循環過程當中,就訪問不到第三個22。
解決:
反向刪除
利用迭代器刪除(多線程會報錯)
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 的工做流程
用戶發請求-->DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制。
DispatcherServlet-->HandlerMapping,HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器,多個HandlerInterceptor攔截器)。
DispatcherServlet-->HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器。
HandlerAdapter-->處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理,並返回一個ModelAndView對象(包含模型數據,邏輯視圖名)
ModelAndView的邏輯視圖名-->ViewResolver,ViewResoler將把邏輯視圖名解析爲具體的View。
View-->渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構
返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶。