Java面試寶典(2018版)

 版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/chen_2890/article/details/83928763

Java 基礎-------------------------------------------------------------------------------------------------- 1html

基本數據類型--------------------------------------------------------------------------------------------- 1前端

包裝類型--------------------------------------------------------------------------------------------------- 1java

集合--------------------------------------------------------------------------------------------------------- 2mysql

多線程------------------------------------------------------------------------------------------------------ 2nginx

生命週期--------------------------------------------------------------------------------------------------- 2web

熱門面試問題:------------------------------------------------------------------------------------------ 3面試

一、什麼是 GC?爲何要有 GC--------------------------------------------------------------------- 3ajax

二、final, finally 和 finalize 的區別?----------------------------------------------------------------- 3spring

三、什麼是單例模式?實現步驟----------------------------------------------------------------------- 3sql

四、ArrayList 和 LinkedList 有何區別?------------------------------------------------------------- 3

五、HashMap 和 Hashtable 的區別?--------------------------------------------------------------- 3

六、Iterater 和 ListIterator 之間有什麼區別?------------------------------------------------------ 4

七、建立線程的方式?----------------------------------------------------------------------------------- 4

八、什麼是死鎖?----------------------------------------------------------------------------------------- 4

九、wait()與 sleep()的區別?--------------------------------------------------------------------------- 4

十、什麼是 ThreadLocal?ThreadLocal 和 Synchonized 的區別?------------------------- 4

Java Web--------------------------------------------------------------------------------------------------- 5

Ajax---------------------------------------------------------------------------------------------------------- 5

JQuery ------------------------------------------------------------------------------------------------------5

Cookie------------------------------------------------------------------------------------------------------ 5

Session----------------------------------------------------------------------------------------------------- 6

熱門面試問題:------------------------------------------------------------------------------------------- 6

一、原生態 Ajax 執行流程?---------------------------------------------------------------------------- 6

二、轉發(forward)和重定向(redirect)的區別?---------------------------------------------- 6

三、怎麼防止表單重複提交?--------------------------------------------------------------------------- 7

四、web.xml 文件中能夠配置哪些內容?------------------------------------------------------------ 7

數據庫(MySQL) ----------------------------------------------------------------------------------------7

鏈接查詢----------------------------------------------------------------------------------------------------- 7
內鏈接-------------------------------------------------------------------------------------------------------- 7

外鏈接-------------------------------------------------------------------------------------------------------- 7

聯合查詢----------------------------------------------------------------------------------------------------- 8

索引----------------------------------------------------------------------------------------------------------- 9

數據庫引擎-------------------------------------------------------------------------------------------------- 9

存儲過程----------------------------------------------------------------------------------------------------- 9

熱門面試問題:------------------------------------------------------------------------------------------- 10

一、JDBC 編程的步驟?--------------------------------------------------------------------------------- 10

二、事務的 ACID 是什麼?事務併發會產生哪些問題?------------------------------------------ 10

三、數據庫性能優化有哪些方式?--------------------------------------------------------------------- 10

框架部分----------------------------------------------------------------------------------------------------- 11

Spring-------------------------------------------------------------------------------------------------------- 11

Spring 的理解----------------------------------------------------------------------------------------------- 11

Spring Bean 生命週期------------------------------------------------------------------------------------ 12

Spring 中的設計模式-------------------------------------------------------------------------------------- 12

Spring 註解-------------------------------------------------------------------------------------------------- 12

Spring 事務-------------------------------------------------------------------------------------------------- 13

SpringMVC-------------------------------------------------------------------------------------------------- 14

SpringMVC 執行流程------------------------------------------------------------------------------------- 14

springmvc 經常使用註解--------------------------------------------------------------------------------------- 14

SpringMVC 和 Struts2 對比----------------------------------------------------------------------------- 15

Mybatis -------------------------------------------------------------------------------------------------------15

Mybatis 的理解--------------------------------------------------------------------------------------------- 15

Mybatis 緩存 ------------------------------------------------------------------------------------------------16

SpringBoot-------------------------------------------------------------------------------------------------- 16

SpringBoot 簡介------------------------------------------------------------------------------------------- 16

SpringBoot 特性 -------------------------------------------------------------------------------------------16

SpringBoot 核心 -------------------------------------------------------------------------------------------16

SpringCloud ------------------------------------------------------------------------------------------------17

SpringCloud 簡介 -----------------------------------------------------------------------------------------17

SpringCloud 核心組件 -----------------------------------------------------------------------------------17
微服務 -------------------------------------------------------------------------------------------------------17

Docker -------------------------------------------------------------------------------------------------------17

Docker 簡介 ------------------------------------------------------------------------------------------------17

Docker 理解 ------------------------------------------------------------------------------------------------17

Redis ---------------------------------------------------------------------------------------------------------24

Redis 簡介 --------------------------------------------------------------------------------------------------24

Redis 支持的數據類型 -----------------------------------------------------------------------------------24

Redis 應用場景 --------------------------------------------------------------------------------------------24

Redis 持久化 -----------------------------------------------------------------------------------------------24

Redis 的優點 -----------------------------------------------------------------------------------------------24

Solr -----------------------------------------------------------------------------------------------------------25

Solr 簡介 ----------------------------------------------------------------------------------------------------25

Solr 配置 ----------------------------------------------------------------------------------------------------25

倒排索引 ----------------------------------------------------------------------------------------------------25

RabbitMQ/ActiveMQ -------------------------------------------------------------------------------------26

RabbitMQ 簡介 --------------------------------------------------------------------------------------------26

RabbitMQ 特色 --------------------------------------------------------------------------------------------26

RabbitMQ 工做模式 --------------------------------------------------------------------------------------26

ActiveMQ 簡介 ---------------------------------------------------------------------------------------------27

ActiveMQ 工做模式 ---------------------------------------------------------------------------------------27
MQ 對比 -----------------------------------------------------------------------------------------------------27

Dubbo --------------------------------------------------------------------------------------------------------27

Dubbo 簡介 -------------------------------------------------------------------------------------------------27

Dubbo 開發流程 -------------------------------------------------------------------------------------------28

FastDFS -----------------------------------------------------------------------------------------------------28

FastDFS 簡介 ----------------------------------------------------------------------------------------------28

文件上傳流程 -----------------------------------------------------------------------------------------------29

Nginx ---------------------------------------------------------------------------------------------------------29

Nginx 簡介 --------------------------------------------------------------------------------------------------29

Nginx 功能 --------------------------------------------------------------------------------------------------29

Quartz -------------------------------------------------------------------------------------------------------30

Quartz 簡介 ------------------------------------------------------------------------------------------------30

Quartz 核心元素 ------------------------------------------------------------------------------------------30

數據庫筆試題 ----------------------------------------------------------------------------------------------31

用一條 SQL 語句查詢出每門課都大於 80 分的學生姓名 ---------------------------------------31

全部球隊之間的比賽組合 -------------------------------------------------------------------------------31

顯示文章標題,發帖人、最後回覆時間 -------------------------------------------------------------31

航空網的幾個航班查詢題 -------------------------------------------------------------------------------32


Java 基礎

基本數據類型:

在這裏插入圖片描述

包裝類型:

包裝類型是對基本數據類型不足之處的補充。

基本數據類型的傳遞方式是值傳遞,而包裝類型是引用傳遞,同時提供了不少數據類型間轉換的方法。

Java1.5 之後能夠自動裝箱和拆箱。

集合

在這裏插入圖片描述

List:有序、可重複。能夠經過索引快速查找,但進行增刪操做時後續的數據須要移動,因此增刪速度慢。

Set:無序、不可重複。

Map:鍵值對、鍵惟1、值不惟一。Map 集合中存儲的是鍵值對,鍵不能重複,值能夠重複。根據鍵獲得值,對 map 集合遍歷時先獲得鍵的 set 集合,對 set 集合進行遍歷,獲得相應的值。

多線程

在這裏插入圖片描述

新建狀態: 一個新產生的線程重新狀態開始了它的生命週期。它保持這個狀態直到程序 start 這個線程。

運行狀態:當一個新狀態的線程被 start 之後,線程就變成可運行狀態,一個線程在此狀態下被認爲是開始執行其任務

就緒狀態:當一個線程等待另一個線程執行一個任務的時候,該線程就進入就緒狀態。當另外一個線程給就緒狀態的線程發送信號時,該線程才從新切換到運行狀態。

休眠狀態: 因爲一個線程的時間片用完了,該線程從運行狀態進入休眠狀態。當時間間隔到期或者等待的時間發生了,該狀態的線程切換到運行狀態。

終止狀態: 一個運行狀態的線程完成任務或者其餘終止條件發生,該線程就切換到終止狀態。


熱門面試問題:

一、什麼是 GC?爲何要有 GC?

GC(Garbage Collection)是垃圾收集的意思,負責清除對象並釋放內存。Java 提供的 GC 功能能夠自動檢測對象是否超過做用域從而達到自動回收內存的目的,從而防止內存泄漏。

二、final, finally 和 finalize 的區別?

final 用於聲明屬性,方法和類,表示屬性不可變,方法不可被重寫,類不可被繼承。

finally 是異常處理語句結構的一部分,表示老是執行。

finalize 是 object 類的一個方法,在垃圾收集器執行的時候會調用這個對象回收的方法,工垃圾收集時其餘資源的回收,好比關閉文件。

三、什麼是單例模式?實現步驟?

單例模式保證了對象惟一。分爲懶漢式(在類加載時不初始化)和餓漢式(在類加載時就完成了初始化,因此類加載比較慢,但獲取對象的速度快)。

實現步驟:私有化構造函數、建立一個靜態的私有對象、提供公共的訪問方法。

四、ArrayList 和 LinkedList 有何區別?

ArrayList 是基於動態數組的數據結構,LinkedList 是基於鏈表的數據結構;對於隨機訪問 get 和 set,ArrayList 較優,由於 LinkedList 要移動指針;對於新增和刪除操做 add 和 remove,LinedList 較優,由於ArrayList 要移動數據。

五、HashMap 和 Hashtable 的區別?

HashMap 容許空鍵值,Hashtable 不容許;

HashMap 繼承自 AbstractMap,Hashtable 繼承自 Dictionary 類,二者都實現了 Map 接口; HashMap 的方法不是同步的,Hashtable 的方法是同步的。

六、Iterater 和 ListIterator 之間有什麼區別?

Iterator 用來遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List; Iterator 只能夠向前遍歷,而 LIstIterator 能夠雙向遍歷;ListIterator 從 Iterator 接口繼承,而後添加了一些額外的功能,好比添加一個元素、替換一個元素、獲取前面或後面元素的索引位置。

七、建立線程的方式?

繼承 Thread 類

實現 Runnable 接口

使用 Executor 框架

八、什麼是死鎖?

兩個線程或兩個以上線程都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是這些線程都陷入了無限的等待中。

九、wait()與 sleep()的區別?

sleep()來自 Thread 類,wait()來自 Object 類;

調用 sleep()方法,線程不會釋放對象鎖。而調用 wait 方法線程會釋放對象鎖;

sleep()睡眠後不出讓系統資源,wait 讓其餘線程能夠佔用 CPU;

sleep(milliseconds)須要指定一個睡眠時間,時間一到會自動喚醒。而 wait()須要配合 notify()

或者 notifyAll()使用。

十、什麼是 ThreadLocal?ThreadLocal 和 Synchonized 的區別?

線程局部變量。是侷限於線程內部的變量,屬於線程自身全部,不在多個線程間共享。Java提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。

synchronized 是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而 ThreadLocal 爲每個線程都提供了變量的副本,使得每一個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。


Java Web

Ajax

AJAX = Asynchronous JavaScript and XML(異步 JavaScript 和 XML)。

Ajax 的原理簡單來講經過 XmlHttpRequest 對象來向服務器發異步請求,從服務器得到數據,而後用 Javascript 來操做 DOM 而更新頁面。這其中最關鍵的一步就是從服務器得到請求數據。

XmlHttpRequest 是 ajax 的核心機制,它是在 IE5 中首先引入的,是一種支持異步請求的技術。簡單的說,也就是 Javascript 能夠及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
在這裏插入圖片描述

JQuery

JQuery 是一個 JavaScript 庫。功能包括 HTML 元素選取和操做、CSS 操做、HTML 事件函數、 JavaScript 特效和動畫、HTML DOM 遍歷和修改、AJAX 和 Utilities。除此以外,JQuery 還提供了大量插件。

基礎語法: $(selector).action()。

選擇器:主要分四大選擇器,分別是基本選擇器、層次選擇器、過濾選擇器、屬性過濾選擇器。

事件:例如 click()、dblclick()、mouseenter()、mouseleave()、mousedown()等。

Cookie

在 web 程序中是使用 HTTP 協議來傳輸數據的,由於 http 是無狀態協議,一旦數據交換完畢,客戶端和服務器端的鏈接就會關閉,再次交換數據須要創建新的鏈接,因此沒法實現會話跟蹤,cookie 技術則彌補了這一缺陷。

cookie 實際上一段的文本信息,客戶端請求服務器。若是服務器須要記錄該用戶的狀態,就使用 response 向客戶端瀏覽器頒發一個 cookie。客戶端瀏覽器會把 cookie 保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該 cookie 一同提交給服務器。服務器檢查該 cookie,以此來辨認用戶的狀態。服務器還能夠根據須要修改 cookie 的內容。
cookie 生命週期:

cookie 的 maxAge 決定 cookie 的生命週期,單位爲秒(second)。cookie 經過 getMaxAge() 方法和 setMaxAge()方法來得到 maxAge 屬性,若是 maxAhe 屬性爲正,則表示 cookie 會在 maxAge 秒以後自動失效。若是 maxAge 屬性爲負,則說明 cookie 僅在本瀏覽器窗口和本窗口打開的子窗口下有效,關閉窗口 cookie 則失效。maxAge 的默認值是-1 當 maxAge 的值爲 0 時,表示刪除 cookie。

Session

session 也是一種記錄客戶狀態的機制,不一樣的是 cookie 保存在客戶端瀏覽器中,而 session 保存在服務器上。客戶端瀏覽器訪問服務器是時候把客戶端信息以某種形式記錄在服務器上,這就是 session 中查找該客戶的狀態。

session 生命週期:

session 保存在服務器端,爲了得到更高的存取速度,服務器通常把 session 放在內存。每一個用戶都會有一個獨立的 session,若是 session 內容過於複雜,當大量客戶訪問服務器時可能會致使內存溢出。

session 在用戶第一次訪問服務器的時候自動建立,須要注意只有訪問 JSP,Servlet 等程序時纔會建立 session;只要訪問 HTML、IMAGE 等靜態資源不會建立 session。若是還沒有生成session,可使用 request.getSession(true)強制生成 session。

session 生成後,只要用戶訪問,服務器就會更新 session 的最後訪問時間,並維護該 session。用戶每訪問服務器一次,不管是否續寫 session 服務器都認爲該用戶的 session 活躍(active)了一次。

Session 對應的類是 javax.servlet.http.HttpSession,每個訪問者都對應一個 session 對象,並將其狀態信息保存在這個 session 對象中,session 對象的建立是在用戶第一次訪問服務器時產生的。


熱門面試問題:

一、原生態 Ajax 執行流程?

建立 XMLHttpRequest 對象;

註冊回調函數;

設置鏈接信息;

發送數據,與服務器開始交互;

接受服務器返回數據。

二、轉發(forward)和重定向(redirect)的區別?

forward 是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的 URL,把那個 URL 的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。

redirect 就是服務器端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,所以從瀏覽器的地址欄中能夠看到跳轉後的連接地址,很明顯 redirect 沒法訪問到服務器保護起來資源,可是能夠從一個網站 redirect 到其餘網站。

三、怎麼防止表單重複提交?

i.禁掉提交按鈕。表單提交後使用 Javascript 使提交按鈕 disable。

ii.Post/Redirect/Get 模式。在提交後執行頁面重定向,這就是所謂的 Post-Redirect-Get (PRG) 模式。簡言之,當用戶提交了表單後,你去執行一個客戶端的重定向,轉到提交成功信息頁面。

iii.在 session 中存放一個特殊標誌。當表單頁面被請求時,生成一個特殊的字符標誌串,存在 session 中,同時放在表單的隱藏域裏。接受處理表單數據時,檢查標識字串是否存在,並當即從 session 中刪除它,而後正常處理數據。

四、web.xml 文件中能夠配置哪些內容?

web.xml 用於配置 Web 應用的相關信息,如:監聽器(listener)、過濾器(filter)、 Servlet、相關參數、會話超時時間、安全驗證方式、錯誤頁面等。


數據庫(MySQL)

鏈接查詢

分類:內鏈接、外鏈接、天然鏈接(略)、交叉鏈接(略)。

內鏈接

基本語法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;

從左表中取出每一條記錄,去右表中與全部的記錄進行匹配:匹配必須是某個條件在左表中與右表中相同最終纔會保留結果,不然不保留。

外鏈接

基本語法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

left join: 左外鏈接(左鏈接), 以左表爲主表

right join: 右外鏈接(右鏈接), 以右表爲主表

以某張表爲主,取出裏面的全部記錄,而後每條與另一張表進行鏈接:無論能不能匹配上條件,最終都會保留。能匹配,正確保留;不能匹配,其餘表的字段都置空 NULL。
在這裏插入圖片描述
左外鏈接在這裏插入圖片描述
右外鏈接在這裏插入圖片描述

聯合查詢

基本語法:

Select 語句 1
		
		Union [union 選項]
		
		Select 語句 2
		
		……

將屢次查詢(多條 select 語句), 在記錄上進行拼接(字段不會增長),每一條 select 語句獲取的字段數必須嚴格一致(可是字段類型無關)。

其中 union 選項有 2 個。ALL:保留全部;Distinct(默認):去重。

應用:查詢同一張表,可是有不一樣的需求;查詢多張表,多張表的結構徹底一致,保存的數據也是同樣的。

在聯合查詢中,order by 不能直接使用。須要對查詢語句使用括號才行。另外須要配合 limit 使用。

索引

若是說數據庫表中的數據是一本書,那麼索引就是書的目錄。索引可以讓咱們快速的定位想要查詢的數據。

索引的結構:BTree 索引和 Hash 索引。

MyISAM 和 InnoDB 存儲引擎:只支持 BTREE 索引, 也就是說默認使用 BTREE,不可以更換。

MEMORY/HEAP 存儲引擎:支持 HASH 和 BTREE 索引。

索引的分類:單列索引(普通索引,惟一索引,主鍵索引)、組合索引、全文索引、空間索引。

數據庫引擎

InnoDB:支持事務處理,支持外鍵,支持崩潰修復能力和併發控制。若是須要對事務的完整

性要求比較高(好比銀行),要求實現併發控制(好比售票),那選擇 InnoDB 有很大的優點。

若是須要頻繁的更新、刪除操做的數據庫,也能夠選擇 InnoDB,由於支持事務的提交(commit)

和回滾(rollback)。

MyISAM:插入數據快,空間和內存使用比較低。若是表主要是用於插入新記錄和讀出記錄,

那麼選擇 MyISAM 能實現處理高效率。若是應用的完整性、併發性要求比較低,也可使

用。

MEMORY:全部的數據都在內存中,數據的處理速度快,可是安全性不高。若是須要很快的

讀寫速度,對數據的安全性要求較低,能夠選擇 MEMOEY。它對錶的大小有要求,不能建

立太大的表。因此,這類數據庫只使用在相對較小的數據庫表。

存儲過程

SQL 語句須要先編譯而後執行,而存儲過程(Stored Procedure)是一組爲了完成特定功能的 SQL 語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它。

存儲過程是可編程的函數,在數據庫中建立並保存,能夠由 SQL 語句和控制結構組成。當想要在不一樣的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是很是有用的。數據庫中的存儲過程能夠看作是對編程中面向對象方法的模擬,它容許控制數據的訪問方式。

存儲過程的優勢:
加強 SQL 語言的功能和靈活性;
標準組件式編程;
較快的執行速度;
減小網絡流量;
做爲一種安全機制來充分利用。


熱門面試問題:

一、JDBC 編程的步驟?

(1) 註冊驅動;

(2) 獲取鏈接對象 Connection;

(3) 建立 Statement 對象;

(4) 運行 SQL 語句;

(5) 處理結果;

(6) 關閉鏈接釋放資源。

二、事務的 ACID 是什麼?事務併發會產生哪些問題?

ACID 表示事務的特性:原子性、一致性、隔離性和持久性。

  • 原子性(Atomic):事務中各項操做,要麼全作要麼全不作,任何一項操做的失敗都會致使整個事務的失敗;

  • 一致性(Consistent):事務結束後系統狀態是一致的;

  • 隔離性(Isolated):併發執行的事務彼此沒法看到對方的中間狀態;

  • 持久性(Durable):事務完成後所作的改動都會被持久化,即便發生災難性的失敗。經過日誌和同步備份能夠在故障發生後重建數據。

事務併發產生的問題:髒讀、幻讀、不可重複讀。

髒讀(Dirty Read):A 事務讀取 B 事務還沒有提交的數據並在此基礎上操做,而 B 事務執行回滾,那麼 A 讀取到的數據就是髒數據。

幻讀(Phantom Read):事務 A 從新執行一個查詢,返回一系列符合查詢條件的行,發現其中插入了被事務 B 提交的行。

不可重複讀(Unrepeatable Read):事務 A 從新讀取前面讀取過的數據,發現該數據已經被另外一個已提交的事務 B 修改過了。

三、數據庫性能優化有哪些方式?
SQL 優化:
		儘可能避免使用 SELECT	*;
		只查詢一條記錄時使用 limit 1;
		使用鏈接查詢代替子查詢;
		儘可能使用一些能經過索引查詢的關鍵字。
表結構優化:

		儘可能使用數字類型字段,提升比對效率;
		長度不變且對查詢速度要求高的數據能夠考慮使用 char,不然使用 varchar;表中字段過多時能夠適當的進行垂直分割,將部分字段移動到另一張表;表中數據量過大能夠適當的進行水平分割,將部分數據移動到另一張表。

其它優化:

		對查詢頻率高的字段適當的創建索引,提升效率;根據表的用途使用合適的數據庫引擎;讀寫分離。

框架部分

Spring

Spring 的理解

spring 是一個開源框架,Spring 爲簡化企業級應用開發而生,使用 Spring 可使簡單的 JavaBean 實現之前只有 EJB 才能實現的功能。Spring 是一個 IOC 和 AOP 容器框架。 Spring 主要核心是:

(1)控制反轉(IOC):傳統的 java 開發模式中,當須要一個對象時,咱們會本身建立一個對象,而在 Spring 開發模式中,Spring 容器使用了工廠模式爲咱們建立了所須要的對象,咱們直接調用 Spring 爲咱們提供的對象便可,這就是控制反轉的思想。實例化一個 java 對象有三種方式:使用類構造器,使用靜態工廠方法,使用實例工廠方法。當使用 spring 時咱們不須要關心經過何種方式實例化一個對象,spring 經過控制反起色制自動爲咱們實例化一個對象。

(2)依賴注入(DI):Spring 使用 Java Bean 對象的 Set 方法或者帶參數的構造方法爲咱們在建立所需對象時將其屬性自動設置所須要的值的過程就是依賴注入的基本思想。

(3)面向切面編程(AOP):在面向對象編程(OOP)思想中,咱們將事物縱向抽象成一個個的對象。而在面向切面編程中,咱們將一個個對象某些相似的方面橫向抽象成一個切面,對這個切面進行一些如權限驗證,事物管理,記錄日誌等公用操做處理的過程就是面向切面編程的思想。

在 Spring 中,全部管理的對象都是 JavaBean 對象,而 BeanFactory 和 ApplicationContext 就是 spring 框架的兩個 IOC 容器,如今通常使用 ApplicationContext,其不但包含了 BeanFactory 的做用,同時還進行更多的擴展。

Spring Bean 生命週期

1.Spring 容器 從 XML 文件中讀取 Bean 的定義,並實例化 Bean。

2.Spring 根據 Bean 的定義填充全部的屬性。

3.若是 Bean 實現了 BeanNameAware 接口,Spring 傳遞 bean 的 ID 到 setBeanName 方法。

4.若是 Bean 實現了 BeanFactoryAware 接口, Spring 傳遞 beanfactory 給 setBeanFactory 方法。

5.如 果 有 任 何 與 bean 相 關 聯 的 BeanPostProcessors , Spring 會 在postProcesserBeforeInitialization()方法內調用它們。

6.若是 bean 實現 IntializingBean 了,調用它的 afterPropertySet 方法,若是 bean 聲明瞭初始化方法,調用此初始化方法。

7.若是有 BeanPostProcessors 和 bean 關聯,這些 bean 的 postProcessAfterInitialization()

方法將被調用。

8.若是 bean 實現了 DisposableBean,它將調用 destroy()方法。注意:

有兩個重要的 bean 生命週期方法,第一個是 setup() , 它是在容器加載 bean 的時候被調用。第二個方法是 teardown() 它是在容器卸載類的時候被調用。

The bean 標籤有兩個重要的屬性 init-method 和 destroy-method。使用它們你能夠本身定製初始化和註銷方法。它們也有相應的註解@PostConstruct 和@PreDestroy。

Spring 中的設計模式

代理模式—Spring 中兩種代理方式,若目標對象實現了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 類代理,若目標對象沒有實現任何接口,spring 使用 CGLIB 庫生成目標對象的子類。

單例模式—在 spring 配置文件中定義的 bean 默認爲單例模式。

模板方法模式—用來解決代碼重複的問題。好比: RestTemplate, JmsTemplate, JpaTemplate。

前端控制器模式—Srping 提供了 DispatcherServlet 來對請求進行分發。

視圖幫助(View Helper )—Spring 提供了一系列的 JSP 標籤,高效宏來輔助將分散的代碼整合在視圖裏。

依賴注入—貫穿於 BeanFactory/ApplicationContext 接口的核心理念。

工廠模式—在工廠模式中,咱們在建立對象時不會對客戶端暴露建立邏輯,而且是經過使用一個共同的接口來指向新建立的對象。Spring 中使用 BeanFactory 用來建立對象的實例。

Spring 註解

Spring 在 2.5 版本之後開始支持用註解的方式來配置依賴注入。能夠用註解的方式來替代 XML 方式的 bean 描述,能夠將 bean 描述轉移到組件類的內部,只須要在相關類上、方法上或者字段聲明上使用註解便可。註解注入將會被容器在 XML 注入以前被處理,因此後者會覆蓋掉前者對於同一個屬性的處理結果。

註解裝配在 Spring 中是默認關閉的。因此須要在 Spring 文件中配置一下才能使用基於註解的裝配模式。若是你想要在你的應用程序中使用關於註解的方法的話,請參考以下的配置。

<beans>

<context:annotation-config/>

<!-- bean definitions go here -->

</beans>

在 context:annotation-config/標籤配置完成之後,就能夠用註解的方式在 Spring 中向屬

性、方法和構造方法中自動裝配變量。

幾種比較重要的註解類型:

1.@Required:該註解應用於設值方法。

2.@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變量。

3.@Qualifier:該註解和@Autowired 註解搭配使用,用於消除特定 bean 自動裝配的歧義。

4.JSR-250 Annotations: Spring 支持基於 JSR-250 註解的如下註解,@Resource、 @PostConstruct 和 @PreDestroy。

Spring 事務

Spring 支持兩種類型的事務管理:

1.編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。

2.聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和 XML 配置來管理事務。

Spring 事務配置示例(使用 tx 標籤配置的攔截器)

<!-- 定義事務管理器(聲明式的事務) -->

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<!-- 配置 Advice 通知 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes>

<tx:method name="*" propagation="REQUIRED" /> </tx:attributes>

</tx:advice>

<!-- 配置切點切面 -->

<aop:config>

<aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" />

<aop:advisor advice-ref="txAdvice"

pointcut-ref="interceptorPointCuts" />

</aop:config>

SpringMVC

SpringMVC 執行流程

在這裏插入圖片描述
一、用戶發送請求至 DispatcherServlet(前端控制器);

二、DispatcherServlet 收到請求調用 HandlerMapping(處理器映射器);

三、HandlerMapping 找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給 DispatcherServlet;

四、DispatcherServlet 調用 HandlerAdapter(處理器適配器);

五、HandlerAdapter 通過適配調用具體的 Controller (處理器,也叫後端控制器);

六、Controller 執行完成返回 ModelAndView 對象;

七、HandlerAdapter 將 controller 執行結果 ModelAndView 返回給 DispatcherServlet;

八、DispatcherServlet 將 ModelAndView 傳給 ViewReslover(視圖解析器);

九、ViewReslover 解析後返回具體 View;

十、DispatcherServlet 根據 View 進行渲染視圖(即將模型數據填充至視圖中);

十一、DispatcherServlet 響應用戶。

springmvc 經常使用註解

@RequestMapping:是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。

@PathVariable:用於將請求 URL 中的模板變量映射到功能處理方法的參數上,即取出 uri 模板中的變量做爲參數。

@requestParam : 主 要 用 於 在 SpringMVC 後 臺 控 制 層 獲 取 參 數 , 類 似 一 種 是request.getParameter(「name」),它有三個經常使用參數:defaultValue = 「0」, required = false, value = 「isApp」;defaultValue 表示設置默認值,required 銅過 boolean 設置是不是必需要傳入的參數,value 值表示接受的傳入的參數類型。

@ResponseBody : 該 注 解 用 於 將 Controller 的 方 法 返 回 的 對 象 , 通 過 適 當 的HttpMessageConverter 轉換爲指定格式後,寫入到 Response 對象的 body 數據區。使用時機:返回的數據不是 html 標籤的頁面,而是其餘某種格式的數據時(如 json、xml 等)使用 @RequestBody : 該 注 解 常 用 來 處 理 Content-Type: 不 是 application/x-www-form-urlencoded 編碼的內容,例如 application/json, application/xml 等; @RequestHeader :能夠把 Request 請求 header 部分的值綁定到方法的參數上。

@CookieValue :能夠把 Request header 中關於 cookie 的值綁定到方法的參數上。

SpringMVC 和 Struts2 對比

機制:spring mvc 的入口是 servlet,而 struts2 是 filter(這裏要指出,filter 和 servlet 是不一樣的。之前認爲 filter 是 servlet 的一種特殊),這樣就致使了兩者的機制不一樣,這裏就牽涉到 servlet 和 filter 的區別了。

性能:spring 會稍微比 struts 快。spring mvc 是基於方法的設計,而 sturts 是基於類,每次發一次請求都會實例一個 action,每一個 action 都會被注入屬性,而 spring 基於方法,粒度更細,但要當心把握像在 servlet 控制數據同樣。spring3 mvc 是方法級別的攔截,攔截到方法後根據參數上的註解,把 request 數據注入進去,在 spring3 mvc 中,一個方法對應一個 request 上下文。而 struts2 框架是類級別的攔截,每次來了請求就建立一個 Action,而後調用 setter getter 方法把 request 中的數據注入;struts2 其實是經過 setter getter 方法與 request 打交道的;struts2 中,一個 Action 對象對應一個 request 上下文。

參數傳遞:struts 是在接受參數的時候,能夠用屬性來接受參數,這就說明參數是讓多個方法共享的。

設計思想上:struts 更加符合 oop 的編程思想,spring 就比較謹慎,在 servlet 上擴展。

Mybatis

Mybatis 的理解

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎全部的 JDBC 代碼和手工設置參數以及抽取結果集。MyBatis 使用簡單的 XML 或註解來配置和映射基本體,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。

Mybatis 的優勢:

一、簡單易學。mybatis 自己就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個 jar 加配置幾個 sql 映射文件,易於學習,易於使用,經過文檔和源代碼,能夠比較徹底的掌握它的設計思路和實現;

二、靈活。mybatis 不會對應用程序或者數據庫的現有設計強加任何影響。 sql 寫在 xml 裏,便於統一管理和優化。經過 sql 基本上實現不使用數據訪問框架能夠實現的全部功能;

三、解除 sql 與程序代碼的耦合。經過提供 DAO 層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql 和代碼的分離,提升了可維護性;四、提供映射標籤,支持對象與數據庫的 orm 字段關係映射;五、提供對象關係映射標籤,支持對象關係組建維護;

六、提供 xml 標籤,支持編寫動態 sql。

Mybatis 緩存

一級緩存:Mybatis 的一級緩存的做用域是 session,當 openSession()後,若是執行相同的SQL(相同語句和參數),Mybatis 不進行執行 SQL,而是從緩存中命中返回。

二級緩存:Mybatis 的二級緩存的做用域是一個 mapper 的 namespace,同一個 namespace 中查詢 sql 能夠從緩存中命中。二級緩存是能夠跨 session 的。

SpringBoot

SpringBoot 簡介

Spring Boot(英文中是「引導」的意思),是用來簡化 Spring 應用的搭建到開發的過程。應用開箱即用,只要經過 「just run」(多是 java -jar 或 tomcat 或 maven 插件 run 或 shell 腳本),就能夠啓動項目。兩者,Spring Boot 只要不多的 Spring 配置文件(例如那些 xml,property)。由於「習慣優先於配置」的原則,使得 Spring Boot 在快速開發應用和微服務架構實踐中獲得普遍應用。

SpringBoot 特性

自動配置:針對不少 Spring 應用程序常見的應用功能,Spring Boot 能自動提供相關配置;起步依賴:告訴 Spring Boot 須要什麼功能,它就能引入須要的庫;

命令行界面:這是 Spring Boot 的可選特性,藉此你只需寫代碼就能完成完整的應用程序,無需傳統項目構建;

Actuator:讓你可以深刻運行中的 Spring Boot 應用程序,一探究竟。

SpringBoot 核心

@SpringBootApplication 這個 Spring Boot 核心註解是由其它三個重要的註解組合,分別是:

@SpringBootConfiguration 、 @EnableAutoConfiguration 和 @ComponentScan。

@ SpringBootConfiguration

點開查看發現裏面仍是應用了@Configuration。任何一個標註了@Configuration 的 Java 類定義的都是一個 JavaConfig 配置類。SpringBoot 社區推薦使用基於 JavaConfig 的配置形式,因此,這裏的啓動類標註了@Configuration 以後,自己其實也是一個 IoC 容器的配置類。

@EnableAutoConfiguration

是一個複合註解。最重要的是@Import(EnableAutoConfigurationImportSelector.class),藉助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration 能夠幫助 SpringBoot 應用將全部符合條件的@Configuration 配置都加載到當前 SpringBoot 使用的 IoC 容器。 @ComponentScan

@ComponentScan 這個註解在 Spring 中很重要,它對應 XML 配置中的元素, @ComponentScan 的功能其實就是自動掃描並加載符合條件的組件(好比@Component 和 @Repository 等)或者 bean 定義,最終將這些 bean 定義加載到 IoC 容器中。

SpringCloud

SpringCloud 簡介

spring Cloud 是一個基於 Spring Boot 實現的雲應用開發工具,它爲基於 JVM 的雲應用開發中的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操做提供了一種簡單的開發方式。

SpringCloud 核心組件

服務註冊發現 - Netflix Eureka

配置中心 - spring cloud config

負載均衡-Netflix Ribbon

斷路器 - Netflix Hystrix

路由(網關) - Netflix Zuul

微服務

微服務是一種可讓軟件職責單1、鬆耦合、自包含、能夠獨立運行和部署的架構思想。關鍵思想就是:拆分、單1、獨立、組件化。把本來一個龐大、複雜的項目按業務邊界拆分一個一個獨立運行的小項目,經過接口的方式組裝成一個大的項目。

Docker

Docker 簡介

Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。

Docker 理解

Docker 其實和虛擬機的目的差很少,都是虛擬化技術,可是 docker 比虛擬機更加輕量級,更快,更加易於移植。

鏡像: 建立虛擬機和 docker 都必不可少的東西。建立一個虛擬機,就先得下載操做系統的 ISO 鏡像文件,而後經過鏡像文件安裝操做系統,和實體機相似,而後能在虛擬機中去安裝各類軟件。

容器: 通俗拿 VM 虛擬機和 Docker 來舉例,一個容器就相似於一個虛擬機,只不過在 Docker 技術的術語上稱爲容器。這個容器裏裝的就是咱們部署的應用在運行,和虛擬機同樣能夠開機,關機,重啓。Docker 稱爲容器的運行,關閉,重啓。並且這個容器能夠打包爲鏡像文件,相似虛擬機快照的文件,放在其它虛擬機上又能夠保持原樣能運行,Docker 也是如此,把容器打包爲鏡像文件,而後在新的服務器安裝好的 Docker 環境下導入進去,保持原來的狀態可以運行。

Redis

Redis 簡介

Remote Dictionary Server(Redis)是一個基於 key-value 鍵值對的持久化數據庫存儲系統。支持多種數據結構,這些數據類型都支持 push/pop、add/remove 及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。

Redis 支持的數據類型

字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)

Redis 應用場景

緩存
計數器
發佈訂閱構建消息系統
排行榜

Redis 持久化

RDB 持久化能夠在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。 AOF 持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集。 AOF 文件中的命令所有以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還能夠在後臺對 AOF 文件進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小。

Redis 的優點

性能極高 – Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s 。

豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。
原子 – Redis 的全部操做都是原子性的,意思就是要麼成功執行要麼失敗徹底不執行。單個操做是原子性的。多個操做也支持事務,即原子性,經過 MULTI 和 EXEC 指令包起來。豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過時等等特性。

Solr

Solr 簡介

Solr 是一個基於 Lucene 的 Java 搜索引擎服務器。Solr 提供了層面搜索、命中醒目顯示而且支持多種輸出格式(包括 XML/XSLT 和 JSON 格式)。它易於安裝和配置,並且附帶了一個基於 HTTP 的管理界面。Solr 已經在衆多大型的網站中使用,較爲成熟和穩定。Solr 包裝並擴展了 Lucene,因此 Solr 的基本上沿用了 Lucene 的相關術語。更重要的是,Solr 建立的索引與 Lucene 搜索引擎庫徹底兼容。經過對 Solr 進行適當的配置,某些狀況下可能須要進行編碼,Solr 能夠閱讀和使用構建到其餘 Lucene 應用程序中的索引。此外,不少 Lucene 工具(如 Nutch、 Luke)也可使用 Solr 建立的索引。

Solr 配置

Schema.xml:

在下載 solr 包的安裝解壓目錄的\solr\example\solr\collection1\conf 中找到,它就是 solr 模式關聯的文件。

fieldtype 節點主要用來定義數據類型;

field 節點指定創建索引和查詢數據的字段;

solrQueryParser 指定搜索時多個詞之間的關係,能夠是 or 或 and。

solrconfig.xml:

配置文件主要定義了 SOLR 的一些處理規則,包括索引數據的存放位置,更新,刪除,查詢的一些規則配置。

datadir 節點定義了索引數據和日誌文件的存放位置; lib 節點表示 solr 引用包的位置。

倒排索引

正排表(索引)是以文檔的 ID 爲關鍵字,表中記錄文檔中每一個字的位置信息,查找時掃描表中每一個文檔中字的信息直到找出全部包含查詢關鍵字的文檔。
在這裏插入圖片描述
倒排表(索引)以字或詞爲關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的全部文檔,一個表項就是一個字表段,它記錄該文檔的 ID 和字符在該文檔中出現的位置狀況。在這裏插入圖片描述

RabbitMQ/ActiveMQ

RabbitMQ 簡介

RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。

AMQP:Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。

RabbitMQ 特色

可靠性(Reliability): 使用持久化、傳輸確認和發佈確認機制來保證可靠性。

靈活的路由(Flexible Routing):在消息進入隊列以前,經過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,能夠將多個 Exchange 綁定在一塊兒,也經過插件機制實現本身的 Exchange 。

高可用(Highly Available Queues):隊列能夠在集羣中的機器上進行鏡像,使得在部分節點出問題的狀況下隊列仍然可用。

多種協議(Multi-protocol):RabbitMQ 支持多種消息隊列協議,好比 STOMP、MQTT 等。多語言客戶端(Many Clients):RabbitMQ 幾乎支持全部經常使用語言,好比 Java、.NET、Ruby等。

管理界面(Management UI):RabbitMQ 提供了一個易用的用戶界面,使得用戶能夠監控和管理消息 Broker 的許多方面。

跟蹤機制(Tracing):若是消息異常,RabbitMQ 提供了消息跟蹤機制,使用者能夠找出發生了什麼。

插件機制(Plugin System):RabbitMQ 提供了許多插件,來從多方面進行擴展,也能夠編寫本身的插件。

RabbitMQ 工做模式

簡單模式:一個生產者發送消息到隊列,一個消費者接收。

工做隊列模式:一個生產者,多個消費者,每一個消費者獲取到的消息惟一,多個消費者只有一個隊列。

發佈/訂閱模式:一個生產者發送的消息會被多個消費者獲取,每一個消費者只能從本身訂閱的隊列中獲取。

路由模式:生產者發佈消息的時候添加路由鍵,消費者綁定隊列到交換機時添加鍵值,這樣就能夠接收到須要接收的消息。

通配符模式:基本思想和路由模式是同樣的,只不過路由鍵支持模糊匹配,符號「#」匹配一個或多個詞,符號「*」只匹配一個詞。

ActiveMQ 簡介

ActiveMQ 是 Apache 推出的一款開源的,徹底支持 JMS1.1 和 J2EE1.4 規範的 JMS Provider 實現的消息中間件。

ActiveMQ 工做模式

點對點模式:一個消息只有一個消費者消費。

發佈/訂閱模式:訂閱一個主題的消費者只能消費自它訂閱以後發佈的消息。JMS 規範容許客戶建立持久訂閱,這在必定程度上放鬆了時間上的相關性要求。持久訂閱容許消費者消費它在未處於激活狀態時發送的消息。

MQ 對比

在這裏插入圖片描述

Dubbo

Dubbo 簡介

Dubbo 是一個分佈式服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,以及 SOA 服務治理方案。

其核心部分包括:

遠程通信:提供對多種基於長鏈接的 NIO 框架抽象封裝,包括多種線程模型、序列化、"請求-響應"模式的信息交換方案;

集羣容錯:提供基於藉口方法的透明遠程過程調用,包括多協議支持、軟負載均衡、失敗容錯、地址路由、動態配置等集羣支持;

自動發現:基於註冊中心目錄服務,使服務消費方能動態地查找服務提供方,使地址透明,使服務提供方能夠平滑增長或減小機器。

Dubbo 開發流程

第一步:要在系統中使用 dubbo 應該先搭建一個註冊中心,通常推薦使用 zookeeper;第二步:有了註冊中心而後是發佈服務,發佈服務須要使用 spring 容器和 dubbo 標籤來發布服務。而且發佈服務時須要指定註冊中心的位置;

第三步:服務發佈以後就是調用服務。通常調用服務也是使用 spring 容器和 dubbo 標籤來引用服務,這樣就能夠在客戶端的容器中生成一個服務的代理對象,在 action 或者 Controller 中直接調用 service 的方法便可。

Zookeeper 註冊中心的做用主要就是註冊和發現服務的做用。相似於房產中介的做用,在系統中並不參與服務的調用及數據的傳輸。

FastDFS

FastDFS 簡介

FastDFS 是一個開源的高性能分佈式文件系統(DFS)。 它的主要功能包括:文件存儲,文件同步和文件訪問,以及高容量和負載平衡。主要解決了海量數據存儲問題,特別適合以中小文件(建議範圍:4KB < file_size <500MB)爲載體的在線服務。

FastDFS 系統有三個角色:跟蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)。

Tracker Server:跟蹤服務器,主要作調度工做,起到均衡的做用;負責管理全部的 storage server 和 group,每一個 storage 在啓動後會鏈接 Tracker,告知本身所屬 group 等信息,並保持週期性心跳。

Storage Server:存儲服務器,主要提供容量和備份服務;以 group 爲單位,每一個 group 內

能夠有多臺 storage server,數據互爲備份。

Client:客戶端,上傳下載數據的服務器,也就是咱們本身的項目所部署在的服務器。
在這裏插入圖片描述

Nginx

Nginx 簡介

Nginx 是一款高性能的 http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師 Igor Sysoev 所開發,官方測試 nginx 可以支支撐 5 萬併發連接,而且 cpu、內存等資源消耗卻很是低,運行很是穩定。

Nginx 功能

靜態 HTTP 服務器:Nginx 是一個 HTTP 服務器,能夠將服務器上的靜態文件(如 HTML、圖片)經過 HTTP 協議展示給客戶端。

反向代理服務器:客戶端原本能夠直接經過 HTTP 協議訪問某網站應用服務器,但若是單臺服務器承受不住壓力須要使用多臺服務器共同處理請求,這時能夠在中間加上一個 Nginx,客戶端請求 Nginx,Nginx 請求應用服務器,而後將結果返回給客戶端,此時 Nginx 就是反向代理服務器。

負載均衡:當客戶端訪問量很大,經過反向代理的方式,使用輪詢、加權輪詢和 IP Hash 的策略將請求分配給多臺服務器。

Quartz

Quartz 簡介

Quartz 是一個任務調度框架。它具備如下特色:

強大的調度功能,例如支持豐富多樣的調度方法,能夠知足各類常規及特殊需求;

靈活的應用方式,例如支持任務和調度的多種組合方式,支持調度數據的多種存儲方式;分佈式和集羣能力,Terracotta 收購後在原來功能基礎上做了進一步提高;

做爲 Spring 默認的調度框架,Quartz 很容易與 Spring 集成實現靈活可配置的調度功能。

Quartz 核心元素

Scheduler:任務調度器,實際執行任務調度的控制器。在 spring 中經過 SchedulerFactoryBean 封裝起來;

Trigger :觸發器,用於定義任務調度的時間規則,有 SimpleTrigger 、 CronTrigger 、

DateIntervalTrigger 和 NthIncludedDayTrigger,其中 CronTrigger 用的比較多,在 spring 中

封裝在 CronTriggerFactoryBean 中;

Calendar:一些日曆特定時間點的集合。一個 trigger 能夠包含多個 Calendar,以便排除或

包含某些時間點;

JobDetail:用來描述 Job 實現類及其它相關的靜態信息。如 Job 名字、關聯監聽器等信息。在 spring 中有 JobDetailFactoryBean 和 MethodInvokingJobDetailFactoryBean 兩種實現,若是任務調度只須要執行某個類的某個方法,能夠經過 MethodInvokingJobDetailFactoryBean 來調用;

Job:是一個接口,只有一個方法 void execute(JobExecutionContext context),開發者實現該接口定義運行任務,JobExecutionContext 類提供了調度上下文的各類信息。Job 運行時的信息保存在 JobDataMap 實例中。實現 Job 接口的任務,默認是無狀態的,若要將 Job 設置成有狀態的,在 quartz 中是給實現的 Job 添加@DisallowConcurrentExecution 註解,在與 spring 結合中能夠在 spring 配置文件的 job detail 中配置 concurrent 參數。


數據庫筆試題

用一條 SQL 語句查詢出每門課都大於 80 分的學生姓名

在這裏插入圖片描述

# 準備數據的 sql 代碼:

create	table	score(id	int	primary	key	auto_increment,namevarchar(20),subject

varchar(20),score int);

insert into score values

(null,'張三','語文',81),

(null,'張三','數學',75),

(null,'李四','語文',76),

(null,'李四','數學',90),

(null,'王五','語文',81),

(null,'王五','數學',100),

(null,'王五 ','英語',90);

#答案:

#A:select distinct name from score where name not in (select distinct name from score where score<=80)

#B:select distinct name t1 from score where 80< all (select score from score where name=t1)
全部球隊之間的比賽組合

一張叫 team 的表,裏面只有一個字段 name,一共有 4 條紀錄,分別是 a、b、c、d,對應四個球隊,如今四個球隊進行比賽,用一條 sql 語句顯示全部可能的比賽組合。

#答案:select a.name,b.name	from team a, team b where a.name < b.name
顯示文章標題,發帖人、最後回覆時間

表:id,title,postuser,postdate,parentid

準備 sql 語句:

drop table if exists articles;
create table articles(id int auto_increment primary key,titlevarchar(50), postuser varchar(10), postdate datetime,parentid int referencesarticles(id)); insert into articles values

(null,'第一條','張三','1998-10-10 12:32:32',null), (null,'第二條','張三','1998-10-10 12:34:32',null), (null,'第一條回覆 1','李四','1998-10-10 12:35:32',1), (null,'第二條回覆 1','李四','1998-10-10 12:36:32',2), (null,'第一條回覆 2','王五','1998-10-10 12:37:32',1), (null,'第一條回覆 3','李四','1998-10-10 12:38:32',1), (null,'第二條回覆 2','李四','1998-10-10 12:39:32',2), (null,'第一條回覆 4','王五','1998-10-10 12:39:40',1);

#答案:

select a.title,a.postuser, (select max(postdate) from articles where parentid=a.id ) reply from articles a where a.parentid is null;

#註釋:子查詢能夠用在選擇列中,也可用於 where 的比較條件中,還能夠用於 from 從句中。

航空網的幾個航班查詢題

在這裏插入圖片描述

一、查詢起飛城市是北京的全部航班,按到達城市的名字排序

參與運算的列是我起碼可以顯示出來的那些列,但最終我不必定把它們顯示出來。各個表組合出來的中間結果字段中必須包含全部運算的字段。

select * from flight f,city c

where f.endcityid =c.cityid and startcityid =

(select c1.cityidfrom city c1 where c1.cityname = "北京")

order by c.citynameasc;

select flight.flightid,'北京' startcity, e.cityname from flight,city e

where flight.endcityid=e.cityid and flight.startcityid=( selectcityid from city where cityname='北京');

select flight.flightid,s.cityname,e.cityname from flight,city s,city e 

where flight.startcityid=s.cityid and s.cityname='北京' andflight.endCityId=e.cit yID order by e.cityName desc;
二、查詢北京到上海的全部航班紀錄(起飛城市,到達城市,起飛時間,航班號)
select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'
三、查詢具體某一天(2005-5-8)的北京到上海的的航班次數
select count(*) from

(select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'

and 查幫助得到的某個日期處理函數(startTime) like '2005-5-8%' mysql 中提取日期部分進行比較的示例代碼以下:

select * from flight wheredate_format(starttime,'%Y-%m-%d')='1998-01-02'

ok,Java面試寶典就總結到這裏
必定會及時更新最新Java面試題
要是對個人文章感興趣的話,就快關注我吧

相關文章
相關標籤/搜索