面試:第六章:面試題收集

//面向?qū)ο螅?br>面向?qū)ο蟮奶卣鳎?抽象性 2繼承 3封裝 4多態(tài)性
多態(tài)性的四種體現(xiàn):1接口和接口的繼承 2類和類的繼承 3重載 4重寫
重載在同一個類里同名形參列表不同,重寫在實(shí)現(xiàn)類里面。

jvm:是Java Virtual Machine(Java虛擬機(jī))的縮寫,是整個Java實(shí)現(xiàn)跨平臺的最核心的部分。JVM是Java平臺的基礎(chǔ)。
所有Java程序先編譯為.class文件。
內(nèi)存泄露與溢出的區(qū)別:
1內(nèi)存泄露是指被分配出去的內(nèi)存無法收回了。
2內(nèi)存溢出是指程序要求的內(nèi)存超過了系統(tǒng)所能分配的范圍。
3內(nèi)存溢出是提供的內(nèi)存不夠,內(nèi)存泄漏是無法在提供內(nèi)存資源。

GC線程是守護(hù)線程
GC是不確定的,當(dāng)監(jiān)控的對象確定為不可達(dá)時就有責(zé)任回收,但并不保證一定會運(yùn)行。
Java理論上不會存在內(nèi)存泄漏。
伊甸園,對象最初誕生的區(qū)域。
幸存者樂園,從伊甸園幸存的對象會挪到這里。
終生頤養(yǎng)園,足夠老的幸存對象的歸宿。

什么是JVM,什么是JDK,什么是JRE
JVM:Java Virtual Machine(Java虛擬機(jī)的縮寫)
JRE:java runtime environment(Java運(yùn)行環(huán)境的縮寫)光有JVM還不能讓class文件執(zhí)行,還需要類庫lib。
可以認(rèn)為JDK目錄里面jre目錄里有兩個文件夾,可以認(rèn)為bin就是jvm,lib就是所需的類庫。jvm和類庫lib合起來就是JRE
JDK:java development kit(java開發(fā)工具包)
JDK包含JRE,JRE包含JVM。

Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過兩大步驟:1、源文件由編譯器編譯成字節(jié)碼(ByteCode)  2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行

JVM中類的加載是由ClassLoader和它的子類來實(shí)現(xiàn)的,Java ClassLoader是一個很重要的JAVA運(yùn)行時系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時查找和裝入類文件的類。

雙親委派機(jī)制,ClassLoader類加載器用來加載類到虛擬機(jī)中,java文件經(jīng)過編譯器編譯后轉(zhuǎn)換成java.lang.Class類的一個實(shí)例。
某個特定的類加載器在接到加載類的請求時,首先將加載任務(wù)委托給父類加載器,依次遞歸,如果可以完成成功返回,無法完成才自己去加載。

多線程與鎖的問題:
實(shí)現(xiàn)多線程的方法有四種:1繼承Thread類 2實(shí)現(xiàn)Runnable接口 3實(shí)現(xiàn)Callable接口通過FutrueTask包裝器來創(chuàng)建Thread線程 4線程池比如ExectorService。

樂觀鎖和悲觀鎖
樂觀鎖:取數(shù)據(jù)的時候默認(rèn)沒有其他人去跟新這個數(shù)據(jù),不會上鎖,提高吞吐量。
悲觀鎖:默認(rèn)上鎖,如果數(shù)據(jù)間經(jīng)常沖突就比較適合。

臟讀就是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這
個數(shù)據(jù)。因?yàn)檫@個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務(wù)讀到的這個數(shù)據(jù)是臟數(shù)據(jù)(Dirty Data),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。

不可重復(fù)讀是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改,那么第一個事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。

抽象類(abstract class)和接口(interface)有什么異同?
抽象類:
1.抽象類中可以定義構(gòu)造器
2.可以有抽象方法和具體方法
3.接口中的成員全都是public的
4.抽象類中可以定義成員變量
5.有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法
6.抽象類中可以包含靜態(tài)方法
7.一個類只能繼承一個抽象類
接口:
1.接口中不能定義構(gòu)造器
2.方法全部都是抽象方法
3.抽象類中的成員可以是 private、默認(rèn)、protected、public
4.接口中定義的成員變量實(shí)際上都是常量
5.接口中不能有靜態(tài)方法
6.一個類可以實(shí)現(xiàn)多個接口
相同:
1.不能夠?qū)嵗?br>2.可以將抽象類和接口類型作為引用類型
3.一個類如果繼承了某個抽象類或者實(shí)現(xiàn)了某個接口都需要對其中的抽象方法全部進(jìn)行實(shí)現(xiàn),否則該類仍然需要
被聲明為抽象類

 闡述靜態(tài)變量和實(shí)例變量的區(qū)別?
靜態(tài)變量: 是被 static 修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創(chuàng)建多少個對象,靜態(tài)變量在內(nèi)存中有且僅有一個拷貝;
實(shí)例變量: 必須依存于某一實(shí)例,需要先創(chuàng)建對象然后通過對象才能訪問到它。靜態(tài)變量可以實(shí)現(xiàn)讓多個對
象共享內(nèi)存。

==和equals的區(qū)別?
equals和== 最大的區(qū)別是一個是方法一個是運(yùn)算符。  
==:如果比較的對象是基本數(shù)據(jù)類型,則比較的是數(shù)值是否相等;如果比較的是引用數(shù)據(jù)類型,則比較的是對象
的地址值是否相等。
equals():用來比較方法兩個對象的內(nèi)容是否相等。
注意:equals 方法不能用于基本數(shù)據(jù)類型的變量,如果沒有對 equals 方法進(jìn)行重寫,則比較的是引用類型的變
量所指向的對象的地址。

break和continue的區(qū)別?
break和continue都是用來控制循環(huán)的語句。
break用于完全結(jié)束一個循環(huán),跳出循環(huán)體執(zhí)行循環(huán)后面的語句。
continue用于跳過本次循環(huán),執(zhí)行下次循環(huán)。

Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?
靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對象,而程序調(diào)用的方法在運(yùn)行期才動
態(tài)綁定,就是引用變量所指向的具體實(shí)例對象的方法,也就是內(nèi)存里正在運(yùn)行的那個對象的方法,而不是引用變
量的類型中定義的方法。

throw和throws的區(qū)別
throw:
1)throw語句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語句處理。
2)throw是具體向外拋出異常的動作,所以它拋出的是一個異常實(shí)例,執(zhí)行throw一定是拋出了某種異常。
throws:
1)throws語句是用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來進(jìn)行異常的處理。
2)throws主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
3)throws表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這種異常。

final、finally、finalize的區(qū)別?
1)final:用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
2)finally:異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
3)finalize:Object類的一個方法,在垃圾回收器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆蓋此方法
提供垃圾收集時的其他資源回收,例如關(guān)閉文件等。該方法更像是一個對象生命周期的臨終方法,當(dāng)該方法
被系統(tǒng)調(diào)用則代表該對象即將“死亡”,但是需要注意的是,我們主動行為上去調(diào)用該方法并不會導(dǎo)致該對
象“死亡”,這是一個被動的方法(其實(shí)就是回調(diào)方法),不需要我們調(diào)用。

String 、StringBuilder 、StringBuffer的區(qū)別?
Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們都可以儲存和操作字符串,區(qū)別
如下。
1)String是只讀字符串,也就意味著String引用的字符串內(nèi)容是不能被改變的。初學(xué)者可能會有這樣的誤解: 如上,字符串str明明是可以改變的呀!其實(shí)不然,str僅僅是一個引用對象,它指向一個字符串對象“abc”。第
二行代碼的含義是讓 str 重新指向了一個新的字符串“bcd”對象,而“abc”對象并沒有任何改變,只不過該對象已
經(jīng)成為一個不可及對象罷了。
2)StringBuffer/StringBuilder 表示的字符串對象可以直接進(jìn)行修改。
3)StringBuilder是Java5中引入的,它和 StringBuffer的方法完全相同,區(qū)別在于它是在單線程環(huán)境下使用的,
因?yàn)樗乃蟹椒ǘ紱]有被synchronized修飾,因此它的效率理論上也比StringBuffer要高。

Java中有幾種類型的流
按照流的方向:輸入流(inputStream)和輸出流(outputStream)。
按照實(shí)現(xiàn)功能分:節(jié)點(diǎn)流(可以從或向一個特定的地方(節(jié)點(diǎn))讀寫數(shù)據(jù)。如 FileReader)和處理流(是對一個
已存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀寫。如BufferedReader。處理流的構(gòu)造方法總是要
帶一個其他的流對象做參數(shù)。一個流對象經(jīng)過其他流的多次包裝,稱為流的鏈接。)
按照處理數(shù)據(jù)的單位:字節(jié)流和字符流。字節(jié)流繼承于 InputStream 和 OutputStream,字符流繼承于
InputStreamReader 和OutputStreamWriter。

字節(jié)流和字符流的區(qū)別
字節(jié)流可以處理所有類型數(shù)
據(jù),如:圖片,MP3,AVI 視頻文件,而字符流只能處理字符數(shù)據(jù)。只要是處理純文本數(shù)據(jù),就要優(yōu)先考慮使用字符
流,除此之外都用字節(jié)流。字節(jié)流主要是操作 byte類型數(shù)據(jù),以 byte 數(shù)組為準(zhǔn),主要操作類就是OutputStream、
InputStream

什么是java序列化,如何實(shí)現(xiàn)java序列化?實(shí)現(xiàn) Serializable 接口
序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化??梢詫α骰蟮膶ο筮M(jìn)行讀
寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題。

java集合類:集合類型主要有3種:set(集)、list(列表)和map(映射)。
List總結(jié),所有的List中只能容納單個不同類型的對象組成的表,可以有相同的元素,基于Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
Set總結(jié),Set實(shí)現(xiàn)的基礎(chǔ)是Map(HashMap);Set中的元素是不能重復(fù)的,

多線程基礎(chǔ):
1繼承Thread類創(chuàng)建線程,寫run方法,然后new Thread,.start();
2實(shí)現(xiàn)Runnable接口創(chuàng)建線程,重寫run方法,new Thread,.start();
3通過Callable和FutureTask創(chuàng)建線程
4通過線程池創(chuàng)建線程
同步的實(shí)現(xiàn)方面有兩種,分別是 synchronized,wait與 notify
wait():使一個線程處于等待狀態(tài),并且釋放所持有的對象的 lock
sleep():使一個正在運(yùn)行的線程處于睡眠狀態(tài),是一個靜態(tài)方法
notify():喚醒一個處于等待狀態(tài)的線程
最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。wait通常被用于線程間交互,sleep通常被用于暫
停執(zhí)行。
線程池就是事先將多個線程對象放到一個容器中,當(dāng)使用的時候就不用new線程而是直接去池中拿線程即可,節(jié)
省了開辟子線程的時間,提高的代碼執(zhí)行效率。

在有些情況下死鎖是可以避免的。兩種用于避免死鎖的技術(shù): 加鎖順序/加鎖時限

進(jìn)程就是一段程序的執(zhí)行過程,線程時進(jìn)程的一個執(zhí)行單位。

啟動一個線程是調(diào)用 start()方法

說說你對Java中反射的理解
反射機(jī)制指的是程序在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法。

動態(tài)代理(以下稱代理),利用Java的反射技術(shù)(Java Reflection),在運(yùn)行時創(chuàng)建一個實(shí)現(xiàn)某些給定接口的新類(也稱“動態(tài)代理類”)及其實(shí)例(對象)
代理的是接口(Interfaces),不是類(Class),更不是抽象類。
反射的官方定義是這樣的:在運(yùn)行狀態(tài)中,對于任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機(jī)制調(diào)用一個類的任意方法,這種動態(tài)獲取類信息及動態(tài)調(diào)用類對象方法的功能稱為java的反射機(jī)制。

設(shè)計模式有哪些 :工廠模式/單例模式
單例模式分為懶漢式和餓漢式
餓漢式直接創(chuàng)建對象,私有化構(gòu)造器。懶漢式聲明變量,私有化構(gòu)造器,提供對外方法。
工廠模式,建立一個工廠類,對實(shí)現(xiàn)了同一接口的一些類進(jìn)行實(shí)例的創(chuàng)建。

棧stack:由系統(tǒng)自動分配,堆heap:需要程序員自己申請。
通常我們定義一個基本數(shù)據(jù)類型的變量,一個對象的引用,還有就是函數(shù)調(diào)用的現(xiàn)場保存都使用 JVM 中的棧空
間;而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對象則放在堆空間

是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char

原生jdbc操作數(shù)據(jù)庫流程?
第一步:Class.forName()加載數(shù)據(jù)庫連接驅(qū)動;
第二步:DriverManager.getConnection()獲取數(shù)據(jù)連接對象;
第三步:根據(jù)SQL獲取sql會話對象
第四步:執(zhí)行SQL處理結(jié)果集,執(zhí)行SQL前如果有參數(shù)值就設(shè)置參數(shù)值setXXX();
第五步:關(guān)閉結(jié)果集、關(guān)閉會話、關(guān)閉連接。

Http 協(xié)議 (超文本傳輸協(xié)議)
HTTP是一個客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。
由HTTP客戶端發(fā)起一個請求,建立一個到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接。HTTP服務(wù)器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求。一旦收到請求,服務(wù)器(向客戶端)發(fā)回一個狀態(tài)行,比如"HTTP/1.1 200 OK",和(響應(yīng)的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。

同步交互:指發(fā)送一個請求,需要等待返回,然后才能夠發(fā)送下一個請求,有個等待過程;
異步交互:指發(fā)送一個請求,不需要等待返回,隨時可以再發(fā)送下一個請求,即不需要等待。 區(qū)別:一個需要等待,一個不需要等待,在部分情況下,我們的項(xiàng)目開發(fā)中都會優(yōu)先選擇不需要等待的異步交互方式。

http常見的狀態(tài)碼
200 OK      //客戶端請求成功
302 found 重定向
400 Bad Request  //客戶端請求有語法錯誤,不能被服務(wù)器所理解
401 Unauthorized //請求未經(jīng)授權(quán)
403 Forbidden  //服務(wù)器收到請求,但是拒絕提供服務(wù)
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯誤
503 Server Unavailable  //服務(wù)器當(dāng)前不能處理客戶端的請求,一段時間后可能恢復(fù)正常

GET和POST的區(qū)別?
1. GET請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間
以&相連,如:login.action?name=zhagnsan&password=123456。POST把提交的數(shù)據(jù)則放置在是HTTP包的包
體中。
2. GET方式提交的數(shù)據(jù)最多只能是1024字節(jié),理論上POST沒有限制,可傳較大量的數(shù)據(jù)。
3.POST的安全性要比GET的安全性高。

http中重定向和請求轉(zhuǎn)發(fā)的區(qū)別?
本質(zhì)區(qū)別:轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。
重定向兩次請求

Cookie和Session的區(qū)別
Cookie 是 web 服務(wù)器發(fā)送給瀏覽器的一塊信息,瀏覽器會在本地一個文件中給每個 web 服務(wù)器存儲 cookie。
Session 是存儲在 web 服務(wù)器端的一塊信息。

1、無論客戶端做怎樣的設(shè)置,session都能夠正常工作。當(dāng)客戶端禁用cookie時將無法使用cookie。
2、在存儲的數(shù)據(jù)量方面:session能夠存儲任意的java對象,cookie只能存儲String類型的對象。

分布式如何實(shí)現(xiàn)session共享
在單點(diǎn)登錄中,如果cookie被禁用了怎么辦?
單點(diǎn)登錄的原理是后端生成一個 session ID,然后設(shè)置到 cookie,后面的所有請求瀏覽器都會帶上 cookie,
然后服務(wù)端從 cookie 里獲取 session ID,再查詢到用戶信息。所以,保持登錄的關(guān)鍵不是 cookie,而是通過
cookie 保存和傳輸?shù)?session ID,其本質(zhì)是能獲取用戶信息的數(shù)據(jù)。除了 cookie,還通常使用 HTTP 請求頭來傳
輸。但是這個請求頭瀏覽器不會像 cookie 一樣自動攜帶,需要手工處理。

什么是jsp,什么是Servlet?jsp和Servlet有什么區(qū)別?
jsp本質(zhì)上就是一個Servlet,它是Servlet的一種特殊形式(由SUN公司推出),每個jsp頁面都是一個servlet
實(shí)例。
Servlet是由 Java提供用于開發(fā) web服務(wù)器應(yīng)用程序的一個組件,運(yùn)行在服務(wù)端,由servlet 容器管理,用來生
成動態(tài)內(nèi)容。一個 servlet 實(shí)例是實(shí)現(xiàn)了特殊接口 Servlet 的 Java 類,所有自定義的 servlet 均必須實(shí)現(xiàn) Servlet 接
口。

區(qū)別:
jsp是html頁面中內(nèi)嵌的Java代碼,側(cè)重頁面顯示;  
Servlet是html代碼和Java代碼分離,側(cè)重邏輯控制

jsp有哪些域?qū)ο蠛蛢?nèi)置對象及他們的作用?
內(nèi)置對象:page/exception/application/pagecontext/session/config/request/response
四大域?qū)ο螅?br>(1)pageContext  page域-指當(dāng)前頁面,在當(dāng)前jsp頁面有效,跳到其它頁面失效
(2)request request域-指一次請求范圍內(nèi)有效,從http請求到服務(wù)器處理結(jié)束,返回響應(yīng)的整個過程。
在這個過程中使用forward(請求轉(zhuǎn)發(fā))方式跳轉(zhuǎn)多個jsp,在這些頁面里你都可以使用這個變量
(3)session session域-指當(dāng)前會話有效范圍,瀏覽器從打開到關(guān)閉過程中,轉(zhuǎn)發(fā)、重定向均可以使用
(4)application context域-指只能在同一個web中使用,服務(wù)器未關(guān)閉或者重啟,數(shù)據(jù)就有效

什么是xml,使用xml的優(yōu)缺點(diǎn),xml的解析器有哪幾種,分別有什么區(qū)別?
xml是一種可擴(kuò)展性標(biāo)記語言,支持自定義標(biāo)簽
優(yōu)點(diǎn):用于配置文件,格式統(tǒng)一,符合標(biāo)準(zhǔn)
缺點(diǎn):xml文件格式復(fù)雜,數(shù)據(jù)傳輸占流量

Xml常用解析器有2種,分別是:DOM和SAX;

Ajax是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的的網(wǎng)頁開發(fā)技術(shù);Asynchronous JavaScript and XML”的縮寫。
Ajax的優(yōu)勢:
通過異步模式,提升了用戶體驗(yàn)。
優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用。
Ajax引擎在客戶端運(yùn)行,承擔(dān)了一部分本來由服務(wù)器承擔(dān)的工作,從而減少了大用戶量下的服務(wù)器負(fù)載。
Ajax的最大特點(diǎn):
可以實(shí)現(xiàn)局部刷新,在不更新整個頁面的前提下維護(hù)數(shù)據(jù),提升用戶體驗(yàn)度。

jsonp原理
JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動態(tài)腳本技術(shù)。在JavaScript中,有一個很重要的安全性限制,
被稱為“Same-Origin Policy”(同源策略)。這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的
限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。

jsonp 的最基本的原理是:動態(tài)添加一個<script>標(biāo)簽,使用 script 標(biāo)簽的 src 屬性沒有跨域的限制的特點(diǎn)實(shí)現(xiàn)跨域。首先在客戶端注冊一個 callback, 然后把 callback 的名字傳給服務(wù)器。此時,服務(wù)器先生成 json 數(shù)
據(jù)。 然后以 javascript 語法的方式,生成一個 function , function 名字就是傳遞上來的參數(shù) jsonp。最后將
json 數(shù)據(jù)直接以入?yún)⒌姆绞剑胖玫?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標(biāo)簽,并執(zhí)行返回的 javascript 文檔,此時數(shù)據(jù)作為參數(shù),傳入到了客戶端預(yù)先定義
好的 callback 函數(shù)里。

常用的Linux命令
列出文件列表:ls 【參數(shù) -a -l】
創(chuàng)建目錄和移除目錄:mkdir  rmdir
用于顯示文件后幾行內(nèi)容:tail
打包:tar -xvf
打包并壓縮:tar -zcvf
查找字符串:grep
顯示當(dāng)前所在目錄:pwd
創(chuàng)建空文件:touch
編輯器:vim  vi
列出文件列表:ls 【參數(shù) -a -l】
創(chuàng)建目錄和移除目錄:mkdir  rmdir
用于顯示文件后幾行內(nèi)容:tail
打包:tar -xvf
打包并壓縮:tar -zcvf
查找字符串:grep
顯示當(dāng)前所在目錄:pwd
創(chuàng)建空文件:touch
編輯器:vim  vi

Mybatis 框架中的mapper 方式中的 # 也能很大程度的防止sql注入($無法防止sql注
入)。

Mysql性能優(yōu)化
1、當(dāng)只要一行數(shù)據(jù)時使用limit 1
3. 用not exists代替not in
4. 對操作符的優(yōu)化,盡量不采用不利于索引的操作符
如:in    not in    is null    is not null    <>  等

在千萬級的數(shù)據(jù)庫查詢中,如何提高效率?
使用explain sql 來分析sql語句

1)數(shù)據(jù)庫設(shè)計方面
a. 對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。  
b. 應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
c. 并不是所有索引對查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進(jìn)行查詢優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時,查詢
可能不會去利用索引
d. 索引并不是越多越好,索引固然可以提高相應(yīng)的 select 的效率,但同時也降低了 insert 及 update 的
效率
e. 應(yīng)盡可能的避免更新索引數(shù)據(jù)列
f. 盡量使用數(shù)字型字段

Spring 框架就像一個家族,有眾多衍生產(chǎn)品例如 boot、security、jpa等等。但他們的基礎(chǔ)都是Spring 的ioc和 aop,ioc 提供了依賴注入的容器, aop解決了面向橫切面的編程,然后在此兩者的基礎(chǔ)上實(shí)現(xiàn)了其他延伸產(chǎn)品的高級功能。

Spring MVC提供了一種輕度耦合的方式來開發(fā)web應(yīng)用。它是Spring的一個模塊,是一個web框架。

Spring Boot實(shí)現(xiàn)了自動配置,降低了項(xiàng)目搭建的復(fù)雜度。它主要是為了解決使用Spring框架需要進(jìn)行大量的配置太麻煩的問題,所以它并不是用來替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開發(fā)者體驗(yàn)的工具。

Spring 是一個“引擎”;

Spring MVC 是基于Spring的一個 MVC 框架;

Spring Boot 是基于Spring4的條件注冊的一套快速開發(fā)整合包。

SpringMVC的工作原理
a. 用戶向服務(wù)器發(fā)送請求,請求被springMVC前端控制器DispatchServlet捕獲;  
b. DispatcherServle對請求URL進(jìn)行解析,得到請求資源標(biāo)識符(URL),然后根據(jù)該URL調(diào)用HandlerMapping
將請求映射到處理器HandlerExcutionChain;
c. DispatchServlet根據(jù)獲得Handler選擇一個合適的HandlerAdapter適配器處理;
d. Handler對數(shù)據(jù)處理完成以后將返回一個ModelAndView()對象給DisPatchServlet;
e. Handler 返回的 ModelAndView()只是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet 通過
ViewResolver試圖解析器將邏輯視圖轉(zhuǎn)化為真正的視圖View;
h. DispatcherServle 通過 model 解析出 ModelAndView()中的參數(shù)進(jìn)行解析最終展現(xiàn)出完整的 view 并返回給
客戶端;

開啟注解處理器和適配器
 springmvc.xml 中通過開啟 <mvc:annotation-driven>來實(shí)現(xiàn)注解處  
理器和適配器的開啟。

如何解決get和post亂碼問題?
解決 post 請求亂碼:我們可以在 web.xml 里邊配置一個 CharacterEncodingFilter 過濾器。 設(shè)置為 utf-8.  
解決 get 請求的亂碼:有兩種方法。對于 get 請求中文參數(shù)出現(xiàn)亂碼解決方法有兩個:  
1. 修改 tomcat 配置文件添加編碼與工程編碼一致。  
2. 另 外 一 種 方 法 對 參 數(shù) 進(jìn) 行 重 新 編 碼 String userName = New
String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);

談?wù)勀銓pring的理解
Spring是一個開源框架,為簡化企業(yè)級應(yīng)用開發(fā)而生。Spring是一個IOC和AOP容器框架。

在Spring容器中為一個bean配置依賴注入有三種方式:
· 使用屬性的setter方法注入  這是最常用的方式;
· 使用構(gòu)造器注入;
· 使用Filed注入(用于注解方式).

Spring容器的主要核心是:
控制反轉(zhuǎn)(IOC)
依賴注入(DI)面向切面編程(AOP),在面向?qū)ο缶幊蹋╫op)思想中,我們將事物縱向抽成一個個的對象。而在面向切面編程
中,我們將一個個的對象某些類似的方面橫向抽成一個切面,對這個切面進(jìn)行一些如權(quán)限控制、事物管理,記錄日志等
公用操作處理的過程就是面向切面編程的思想。AOP底層是動態(tài)代理

Spring中的設(shè)計模式
1單例模式 2模板方式模式 3前端控制器模式 4試圖幫助 5依賴注入 6工廠模式

簡單介紹一下Spring bean的生命周期
1bean定義 2bean初始化 3bean調(diào)用 4bean銷毀

spring結(jié)構(gòu)
(1)核心容器:包括Core、Beans、Context、EL模塊。
(2)AOP、Aspects模塊:

Spring能幫我們做什么?
Spring能幫我們根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關(guān)系
Spring 面向切面編程能幫助我們無耦合的實(shí)現(xiàn)日志記錄,性能統(tǒng)計,安全控制
Spring能非常簡單的幫我們管理數(shù)據(jù)庫事務(wù)
Spring還能與第三方數(shù)據(jù)庫訪問框架(如Hibernate、JPA)無縫集成
Spring還能與第三方Web(如Struts、JSF)框架無縫集成

Spring配置文件有什么作用?
Spring配置文件是個XML 文件,這個文件包含了類信息,描述了如何配置它們,以及如何相互調(diào)用。

 什么是Spring IOC 容器
IOC 控制反轉(zhuǎn):Spring IOC 負(fù)責(zé)創(chuàng)建對象,管理對象。通過依賴注入(DI),裝配對象,配置對象,并且管理這
些對象的整個生命周期。

 IOC的優(yōu)點(diǎn)是什么?
IOC 或 依賴注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測試

什么是Spring的依賴注入?
,spring提出了依賴注入的思想,即依賴類不由程序員實(shí)例化,而
是通過 spring 容器幫我們 new 指定實(shí)例并且將實(shí)例注入到需要該對象的類中。依賴注入的另一種說法是“控制反
轉(zhuǎn)”

Mybatis中#和$的區(qū)別?
#相當(dāng)于對數(shù)據(jù) 加上 雙引號,$相當(dāng)于直接顯示數(shù)據(jù)
 #方式能夠很大程度防止sql注入。
.$方式無法防止Sql注入
$方式一般用于傳入數(shù)據(jù)庫對象
一般能用#的就別用$.

Mybatis的編程步驟是什么樣的?
1、創(chuàng)建SqlSessionFactory
2、通過SqlSessionFactory創(chuàng)建 SqlSession
3、通過sqlsession執(zhí)行數(shù)據(jù)庫操作
4、調(diào)用session.commit()提交事務(wù)
5、調(diào)用session.close()關(guān)閉會話

使用MyBatis的mapper接口調(diào)用時有哪些要求?
1. Mapper接口方法名和mapper.xml中定義的每個sql的id相同
2. Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個sql 的parameterType的類型相同
3. Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相同
4. Mapper.xml文件中的namespace即是mapper接口的類路徑。

MyBatis的動態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯。
MyBatis中用于實(shí)現(xiàn)動態(tài)SQL的元素標(biāo)簽主要有:

if
where
set
choose(when,otherwise)
trim
foreach

Redis的特點(diǎn)?
內(nèi)存高速緩存數(shù)據(jù)庫
該軟件使用C語言編寫,典型的NoSQL數(shù)據(jù)庫服務(wù)器,Redis是一
個key-value存儲系統(tǒng),它支持豐富的數(shù)據(jù)類型,如:string、list、set、zset(sorted set)、hash。
Redis為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以redis具有快速和
數(shù)據(jù)持久化的特征。

Redis常見的性能問題都有哪些?
(1)、Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會阻塞主線程的工作,當(dāng)快照比較大時對性能影響是
非常大的,會間斷性暫停服務(wù),所以Master最好不要寫內(nèi)存快照。
(2)、Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會
不斷增大,AOF文件過大會影響Master重啟的恢復(fù)速度。Master最好不要做任何持久化工作,包括內(nèi)存快照和AOF
日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關(guān)鍵,某個Slave開啟AOF備份數(shù)據(jù),策略為每秒同步一
次。
(3)、Master調(diào)用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會占大量的CPU和內(nèi)存資源,導(dǎo)致服
務(wù)load過高,出現(xiàn)短暫服務(wù)暫?,F(xiàn)象。
(4)、Redis 主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性,Slave 和 Master 最好在同一個局域
網(wǎng)內(nèi)

Redis最適合的場景有哪些?
(1)、會話緩存(Session Cache)
(2)、全頁緩存(FPC)
(3)、隊列
(4)、排行榜/計數(shù)器
(5)、發(fā)布/訂閱

Redis的數(shù)據(jù)結(jié)構(gòu)有五種
String——字符串
String 數(shù)據(jù)結(jié)構(gòu)是簡單的 key-value 類型,value 不僅可以是 String,也可以是數(shù)字(當(dāng)數(shù)字類型用 Long 可
以表示的時候encoding 就是整型,其他都存儲在 sdshdr 當(dāng)做字符串)。
 Hash——字典
在 Memcached 中,我們經(jīng)常將一些結(jié)構(gòu)化的信息打包成 hashmap,在客戶端序列化后存儲為一個字符串的值
(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。
 List——列表
List 說白了就是鏈表(redis 使用雙端鏈表實(shí)現(xiàn)的 List),相信學(xué)過數(shù)據(jù)結(jié)構(gòu)知識的人都應(yīng)該能理解其結(jié)構(gòu)。
Set——集合
Set 就是一個集合,集合的概念就是一堆不重復(fù)值的組合。利用 Redis 提供的 Set 數(shù)據(jù)結(jié)構(gòu),可以存儲一些集
合性的數(shù)據(jù)。
Sorted Set——有序集合
和Sets相比,Sorted Sets是將 Set 中的元素增加了一個權(quán)重參數(shù) score,使得集合中的元素能夠按 score 進(jìn)
行有序排列

Redis的優(yōu)缺點(diǎn)
a) 性能極高 – Redis 能支持超過 100K+ 每秒的讀寫頻率。
b) 豐富的數(shù)據(jù)類型 – Redis 支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets數(shù)據(jù)類型操作。
 c) 原子 – Redis 的所有操作都是原子性的,同時 Redis 還支持對幾個操作全并后的原子性執(zhí)行。

Redis的持久化
RDB 持久化:該機(jī)制可以在指定的時間間隔內(nèi)生成數(shù)據(jù)集的時間點(diǎn)快照
AOF 持久化:記錄服務(wù)器執(zhí)行的所有寫操作命令

消息隊列 ActiveMQ 如何使用ActiveMQ解決分布式事務(wù)?
在互聯(lián)網(wǎng)應(yīng)用中,基本都會有用戶注冊的功能。在注冊的同時,我們會做出如下操作:
1. 收集用戶錄入信息,保存到數(shù)據(jù)庫
2. 向用戶的手機(jī)或郵箱發(fā)送驗(yàn)證碼
等等…

但是在分布式架構(gòu)中,用戶和發(fā)送驗(yàn)證碼是兩個獨(dú)立的服務(wù),它們都有各自的數(shù)據(jù)庫,那么就不能通過本地事物
保證操作的原子性。這時我們就需要用到ActiveMQ(消息隊列)來為我們實(shí)現(xiàn)這個需求。
 
在用戶進(jìn)行注冊操作的時候,我們?yōu)樵摬僮鲃?chuàng)建一條消息,當(dāng)用戶信息保存成功時,把這條消息發(fā)送到消息隊列。
驗(yàn)證碼系統(tǒng)會監(jiān)聽消息,一旦接受到消息,就會給該用戶發(fā)送驗(yàn)證碼。

1.如何防止消息重復(fù)發(fā)送?
解決方法很簡單:增加消息狀態(tài)表。通俗來說就是一個賬本,用來記錄消息的處理狀態(tài),每次處理消息之前,都去
狀態(tài)表中查詢一次,如果已經(jīng)有相同的消息存在,那么不處理,可以防止重復(fù)發(fā)送。

Dubbo
dubbo reference注解問題
@Reference 只能在 springbean 實(shí)例對應(yīng)的當(dāng)前類中使用

dubbo的啟動流程
1服務(wù)端開始啟動,向注冊中心(zookeeper)進(jìn)行注冊
2消費(fèi)者向注冊中心訂閱服務(wù)端自己所需要的服務(wù)
3注冊中心接收到會以(notify)通知方式通知消費(fèi)者
4消費(fèi)者開始向服務(wù)端消費(fèi)自己所需要的服務(wù)
5同時,異步的向監(jiān)控中心記錄下有多少服務(wù)端在啟動,多少消費(fèi)者在消費(fèi)。

Dubbo的客戶端和服務(wù)端有三種連接方式,分別是:廣播,直連和使用zookeeper注冊中心

Dubbo注冊中心和廣播注冊中心配置類似,不過需要指定注冊中心類型和注冊中心地址,這個時候就不是把服務(wù)
信息進(jìn)行廣播了,而是告訴給注冊中心進(jìn)行管理,這個時候我們就需要有一個注冊中心。
官方推薦使用zookeeper作為注冊中心。

調(diào)用關(guān)系說明:
1)服務(wù)容器負(fù)責(zé)啟動,加載,運(yùn)行服務(wù)提供者。
2)服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
3)服務(wù)消費(fèi)者在啟動時,向注冊中心訂閱自己所需的服務(wù)。
4)注冊中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
5)服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺
調(diào)用。
6)服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。

Nginx反向代理為什么能夠提升服務(wù)器性能?
對于后端是動態(tài)服務(wù)來說,Nginx 有個好處是它會把 Request 在讀取完整之前 buffer 住,這樣交給后端的就是一個完整的 HTTP  
請求,從而提高后端的效率,而不是斷斷續(xù)續(xù)的傳遞(互聯(lián)網(wǎng)上連接速度一般比較慢)。 同樣,Nginx 也可以把
response 給 buffer 住,同樣也是減輕后端的壓力。

負(fù)載均衡策略
1、輪詢:這種是默認(rèn)的策略,把每個請求按順序逐一分配到不同的server,如果server掛掉,能自動剔除。
2、最少連接:把請求分配到連接數(shù)最少的server
3、權(quán)重:使用weight來指定server訪問比率
4、ip_hash:每個請求會按照訪問ip的hash值分配,這樣同一客戶端連續(xù)的Web請求都會被分發(fā)到同一server進(jìn)行處理,可以解決session的問題。

Zookeeper
簡單介紹一下zookeeper以及zookeeper的原理
ZooKeeper 是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)
ZooKeeper 的目標(biāo)就是封裝好復(fù)雜易出錯的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、 功能穩(wěn)定的系統(tǒng)提供給用戶

znode節(jié)點(diǎn)每個代表一個屬性,包含當(dāng)前版本,數(shù)據(jù)版本,建立時間和修改時間等

 

Activity 工作流
工作流是將一組任務(wù)組織起來以完成某個經(jīng)營過程:定義了任務(wù)的觸
發(fā)順序和觸發(fā)條件,每個任務(wù)可以由一個或多個軟件系統(tǒng)完成,也可以由一個或一組人完成,還可以由一個或多個人
與軟件系統(tǒng)協(xié)作完。

tomcat集群
單一服務(wù)器終究無法滿足需要處理的負(fù)荷量
修改 tomcat1, tomcat2 的 server.xml 文件添加集群內(nèi)容

在 web 開發(fā)中,如果對象被保存在了 Session 中,tomcat 在重啟時要把 Session 對 象序列化到硬盤,這個對象就必須實(shí)現(xiàn) Serializable 接口。如果對象要經(jīng)過分布式系統(tǒng)進(jìn)行 網(wǎng)絡(luò)傳輸或通過 rmi 等遠(yuǎn)程調(diào)用,這就需要在網(wǎng)絡(luò)上傳輸對象,被傳輸?shù)膶ο缶捅仨殞?shí)現(xiàn) Serializable 接口。
 
Java中的String,StringBuilder,StringBuffer三者的區(qū)別
速度快慢為:StringBuilder > StringBuffer > String
String最慢的原因:String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦創(chuàng)建之后該對象是不可更改的,但后兩者的對象是變量,是可以更改的。
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的(StringBuffer中很多方法可以帶有synchronized關(guān)鍵字)
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況

elasticSearch
倒排索引是搜索引擎的基石,也是Elasticsearch能實(shí)現(xiàn)快速全文搜索的根本。歸納起來,主要是對一個文檔內(nèi)容做兩步操作:分詞、建立“單詞-文檔”列表

線程安全性概念
線程安全:就是多線程訪問時,采用了加鎖機(jī)制,當(dāng)一個線程訪問該類的某個數(shù)據(jù)時,進(jìn)行保護(hù),其他線程不能進(jìn)行訪問直到該線程讀取完,其他線程才可使用。不會出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。
相反地,
線程不安全:就是不提供數(shù)據(jù)訪問保護(hù),有可能出現(xiàn)多個線程先后更改數(shù)據(jù)造成所得的數(shù)據(jù)是臟數(shù)據(jù)。

Java基礎(chǔ)——6種常用類講解
一、System類
二、Runtime類
三、Date類和SimpleDateFormat
四、Calendar類
五、Math類
六、Random類

Java常用的八種排序算法與代碼實(shí)現(xiàn)
1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.冒泡排序 6.快速排序 7.歸并排序 8.基數(shù)排序
總結(jié):
一、穩(wěn)定性:
 穩(wěn)定:冒泡排序、插入排序、歸并排序和基數(shù)排序
不穩(wěn)定:選擇排序、快速排序、希爾排序、堆排序
二、平均時間復(fù)雜度
O(n^2):直接插入排序,簡單選擇排序,冒泡排序。
在數(shù)據(jù)規(guī)模較小時(9W內(nèi)),直接插入排序,簡單選擇排序差不多。當(dāng)數(shù)據(jù)較大時,冒泡排序算法的時間代價最高。性能為O(n^2)的算法基本上是相鄰元素進(jìn)行比較,基本上都是穩(wěn)定的。
O(nlogn):快速排序,歸并排序,希爾排序,堆排序。
其中,快排是最好的, 其次是歸并和希爾,堆排序在數(shù)據(jù)量很大時效果明顯。
三、排序算法的選擇
1.數(shù)據(jù)規(guī)模較小
1)待排序列基本序的情況下,可以選擇直接插入排序;
2)對穩(wěn)定性不作要求宜用簡單選擇排序,對穩(wěn)定性有要求宜用插入或冒泡
2.數(shù)據(jù)規(guī)模不是很大
1)完全可以用內(nèi)存空間,序列雜亂無序,對穩(wěn)定性沒有要求,快速排序,此時要付出log(N)的額外空間。
2)序列本身可能有序,對穩(wěn)定性有要求,空間允許下,宜用歸并排序
3.數(shù)據(jù)規(guī)模很大
1)對穩(wěn)定性有求,則可考慮歸并排序。2)對穩(wěn)定性沒要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡

servlet的生命周期
1.加載和實(shí)例化
2.初始化
3.請求處理
4.服務(wù)終止

tcp是網(wǎng)絡(luò)傳輸協(xié)議
http是超文本傳輸協(xié)議

關(guān)系型數(shù)據(jù)庫
增刪改查

Servlet的生命周期
1.創(chuàng)建Servlet對象,通過服務(wù)器反射機(jī)制創(chuàng)建Servlet對象,第一次請求時才會創(chuàng)建。(默認(rèn))
2,調(diào)用Servlet對象的init()方法,初始化Servlet的信息,init()方法只會在創(chuàng)建后被調(diào)用一次;
3,響應(yīng)請求,調(diào)用service()或者是doGet(),doPost()方法來處理請求,這些方法是運(yùn)行的在多線程狀態(tài)下的。
4,? 在長時間沒有被調(diào)用或者是服務(wù)器關(guān)閉時,會調(diào)用destroy()方法來銷毀Servlet對象。

Java中的四個核心技術(shù)思想
虛擬機(jī)
API
類裝載器的體系結(jié)構(gòu)
class文件

 


簡歷:
用explain分析查詢語句,查看type查看連接使用了哪些類別,有無使用索引,system/const/eq_ref/ref/range/index/all
mysql通過 主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力 這樣的方案來進(jìn)行部署與實(shí)施的。
讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
EXPLAIN可以幫助開發(fā)人員分析SQL問題,explain顯示了mysql如何使用索引來處理select語句以及連接表,可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語句。
使用方法,在select語句前加上Explain就可以了
使用方式主要是樂觀鎖和悲觀鎖。

1. 什么是spring?
java企業(yè)級應(yīng)用的開源開發(fā)框架

2. 使用Spring框架的好處是什么?
輕量級/控制反轉(zhuǎn)IOC,不用去創(chuàng)建對象等/面向切面編程AOP,將業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開/有容器管理對象生命周期和配置/有MVC框架,web框架的替代品/事務(wù)管理/統(tǒng)一的一場管理

9. 解釋對象/關(guān)系映射集成模塊
契合mybatis,支持主流的ORM框架

10.  解釋W(xué)EB 模塊
透明的處理各種請求

13.  什么是Spring IOC 容器?
負(fù)責(zé)創(chuàng)建對象,管理配置對象

14.  IOC的優(yōu)點(diǎn)是什么?
將代碼量降到最低,容易測試

17. 一個Spring的應(yīng)用看起來象什么?
一個定義了功能的接口,實(shí)現(xiàn)各種,包括屬性,方法等

18. 什么是Spring的依賴注入?
DI是IOC的一個方面,不用主動去創(chuàng)建對象

19.  有哪些不同類型的IOC(依賴注入)方式?
構(gòu)造器注入,setter注入

24. 你怎樣定義類的作用域?
在<bean>標(biāo)簽里面定義

27. 解釋Spring框架中bean的生命周期
實(shí)例化,調(diào)用,銷毀

51.  解釋AOP
面向切面的編程,將業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開

64. 什么是Spring的MVC框架?
配備的構(gòu)建Web應(yīng)用的全功能MVC框架,清晰的將業(yè)務(wù)邏輯和控制邏輯分開。

65. DispatcherServlet
用來處理所有的http請求和響應(yīng)。

67. 什么是Spring MVC框架的控制器?
控制器提供訪問應(yīng)用程序的行為,這個行為通過服務(wù)接口實(shí)現(xiàn),控制視圖解析器解析然后呈現(xiàn)一個完整的視圖


spring的工作原理:有IOC反轉(zhuǎn)控制,AOP面向切面編程,利用了反射,在運(yùn)行時動態(tài)的去創(chuàng)建對象,調(diào)用對象的方法,就是讓對象與對象(模塊與模塊)之間的關(guān)系沒有通過代碼來關(guān)聯(lián),都是通過配置類說明管理


mybatis定制了sql存儲過程和高級映射
使用SqlSessionFactory實(shí)例的,一個SqlSessionFactory實(shí)例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預(yù)定義的配置類的實(shí)例獲得。

 

 

項(xiàng)目一
采用了SpringBoot+Dubbo+Zookeeper作為底層架構(gòu),Dubbo是作為服務(wù)之間的通信,Zookeeper作為注冊中心。
采用了SOA分布式架構(gòu),為不同模塊定義接口,功能模塊有很多,例如后臺管理模塊,經(jīng)銷商模塊,訂單模塊,購物車模塊,前臺系統(tǒng),支付模塊,搜索模塊等
該系統(tǒng)用mybatis處理數(shù)據(jù)庫層的操作,后臺的頁面用了easyui來做,里面一些功能是有表的就用了easyui的分頁插件查詢,后端控制的用的是mybatis的PageHelper分頁。
將數(shù)據(jù)封裝傳輸?shù)巾撁骘@示。用了pagehelper的工具類將其封裝。
redis是key-value型數(shù)據(jù)庫
使用 Redis 做為緩存服務(wù)器,提高系統(tǒng)訪問率。Redis分布式鎖,同一時間下只有一個線程能使用相應(yīng)的代碼塊。當(dāng)多個進(jìn)程不在同一個系統(tǒng)中,用分布式鎖控制多個進(jìn)程對資源的訪問。
使用es先將數(shù)據(jù)庫已存在的商品列表分詞封裝,放進(jìn)es數(shù)據(jù)庫里,大大提高了商品檢索效率。如果后臺管理添加了新的產(chǎn)品信息,更新數(shù)據(jù)庫時附帶插入新的es數(shù)據(jù)
使用了nginx反向代理,通過輪詢的方式實(shí)現(xiàn)負(fù)載均衡,提高了系統(tǒng)并發(fā)處理能力。
用了fastfds插件整合在后臺模塊的model里,用來儲存商品的圖片信息,頭像信息等。提高了圖片的處理能力,在linux上配置好相應(yīng)的儲存節(jié)點(diǎn)
后臺管理模塊:
商品列表管理,簡單的增刪改查按鈕,多級分類連級不同的屬性展示不同的商品列表,編輯spu屬性用了easyui的dialog配合動態(tài)網(wǎng)格增加刪除行列來修改屬性值,提交后數(shù)據(jù)庫修改
spu管理是具體的商品詳情管理,同樣三級連級屬性查詢,一件商品有很多的屬性,例如用了fastfds儲存圖片信息等
這里面還有庫存管理sku屬性,添加相應(yīng)的規(guī)格屬性和數(shù)量,也是用dialog,提交就修改數(shù)據(jù)庫
物資詳情頁顯示,后臺提取封裝每個類型產(chǎn)品的屬性作為篩選條件,條件動態(tài)展示,
篩選用了面包屑,還用進(jìn)去單獨(dú)產(chǎn)品頁可以進(jìn)行屬性挑選,不同的產(chǎn)品不同的條件,根據(jù)產(chǎn)品的spu屬性決定,會提示是否有庫存
搜索模塊用了es,es是一個nosql數(shù)據(jù)庫,動態(tài)的將數(shù)據(jù)庫的產(chǎn)品數(shù)據(jù)封裝分詞放進(jìn)去,通過全頁查詢可以查詢出關(guān)鍵字產(chǎn)品。