1、表的設計要符合三範式。html
2、添加適當的索引,索引對查詢速度影響很大,必須添加索引。主鍵索引,惟一索引,普通索引,全文索引前端
3、添加適當存儲過程,觸發器,事務等。java
4、讀寫分離(主從數據庫)node
5、對sql語句的一些優化,(查詢執行速度比較慢的sql語句)mysql
6、分表分區linux
分表:把一張大表分紅多張表。分區:把一張表裏面的分配到不一樣的區域存儲,nginx
7、對mysql服務器硬件的升級操做。程序員
MySQL的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇降低。一樣是取10條數據,下面兩句就不是一個數量級別的。web
1面試 |
select * from table limit 10000,10 |
2 |
select * from table limit 0,10 |
這個可能和我們的數據庫的數據有關!
http://jingyan.baidu.com/article/da1091fbd166ff027849d687.html
這個網頁裏面是數據庫建立索引的步驟!本身理解一下,由於在面試過程當中這個問題問的比較多!!
1、Redis中的事務(transaction)是一組命令的集合。事務同命令同樣都是Redis最小的執行單位,一個事務中的命令要麼都執行,要麼都不執行。Redis事務的實現須要用到 MULTI 和 EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,而後依次發送須要在本次事務中處理的命令,最後再發送 EXEC 命令表示事務命令結束。
2、mysql的事務特性,要求這組操做,要不全都成功,要不全都失敗,這樣就避免了某個操做成功某個操做失敗。利於數據的安全
首先咱們要知道什麼是zookeeper。zookeeper是一個爲分佈式應用提供一致性服務的軟件,它是開源的Hadoop項目中的一個子項目!
(1)配置管理
集中式的配置管理在應用集羣中是很是常見的,通常商業公司內部都會實現一套集中的配置管理中心,應對不一樣的應用集羣對於共享各自配置的需求,而且在配置變動時可以通知到集羣中的每個機器。
Zookeeper很容易實現這種集中式的配置管理,好比將APP1的全部配置配置到/APP1 znode下,APP1全部機器一啓動就對/APP1這個節點進行監控(zk.exist("/APP1",true)),而且實現回調方法Watcher,那麼在zookeeper上/APP1 znode節點下數據發生變化的時候,每一個機器都會收到通知,Watcher方法將會被執行,那麼應用再取下數據便可(zk.getData("/APP1",false,null));
以上這個例子只是簡單的粗顆粒度配置監控,細顆粒度的數據能夠進行分層級監控,這一切都是能夠設計和控制的。
(2)集羣管理
應用集羣中,咱們經常須要讓每個機器知道集羣中(或依賴的其餘某一個集羣)哪些機器是活着的,而且在集羣機器由於宕機,網絡斷鏈等緣由可以不在人工介入的狀況下迅速通知到每個機器。
Zookeeper一樣很容易實現這個功能,好比我在zookeeper服務器端有一個znode叫/APP1SERVERS,那麼集羣中每個機器啓動的時候都去這個節點下建立一個EPHEMERAL類型的節點,好比server1建立/APP1SERVERS/SERVER1(可使用ip,保證不重複),server2建立/APP1SERVERS/SERVER2,而後SERVER1和SERVER2都watch /APP1SERVERS這個父節點,那麼也就是這個父節點下數據或者子節點變化都會通知對該節點進行watch的客戶端。由於EPHEMERAL類型節點有一個很重要的特性,就是客戶端和服務器端鏈接斷掉或者session過時就會使節點消失,那麼在某一個機器掛掉或者斷鏈的時候,其對應的節點就會消失,而後集羣中全部對/APP1SERVERS進行watch的客戶端都會收到通知,而後取得最新列表便可。
另外有一個應用場景就是集羣選master,一旦master掛掉可以立刻能從slave中選出一個master,實現步驟和前者同樣,只是機器在啓動的時候在APP1SERVERS建立的節點類型變爲EPHEMERAL_SEQUENTIAL類型,這樣每一個節點會自動被編號,
咱們默認規定編號最小的爲master,因此當咱們對/APP1SERVERS節點作監控的時候,獲得服務器列表,只要全部集羣機器邏輯認爲最小編號節點爲master,那麼master就被選出,而這個master宕機的時候,相應的znode會消失,而後新的服務器列表就被推送到客戶端,而後每一個節點邏輯認爲最小編號節點爲master,這樣就作到動態master選舉。
Java的設計模式比較多,可是咱們在面試前面至少有看好幾個設計面試,
1.餓漢式單例類
//餓漢式單例類.在類初始化時,已經自行實例化 public class Singleton1 { //私有的默認構造子 private Singleton1() {} //已經自行實例化 private static final Singleton1 single = new Singleton1(); //靜態工廠方法 public static Singleton1 getInstance() { return single; } } |
2.懶漢式單例類
//懶漢式單例類.在第一次調用的時候實例化 public class Singleton2 { //私有的默認構造子 private Singleton2() {} //注意,這裏沒有final private static Singleton2 single=null; //靜態工廠方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } } |
3.登記式單例類
import java.util.HashMap; import java.util.Map; //登記式單例類. //相似Spring裏面的方法,將類名註冊,下次從裏面直接獲取。 public class Singleton3 { private static Map<String,Singleton3> map = new HashMap<String,Singleton3>(); static{ Singleton3 single = new Singleton3(); map.put(single.getClass().getName(), single); } //保護的默認構造子 protected Singleton3(){} //靜態工廠方法,返還此類唯一的實例 public static Singleton3 getInstance(String name) { if(name == null) { name = Singleton3.class.getName(); System.out.println("name == null"+"--->name="+name); } if(map.get(name) == null) { try { map.put(name, (Singleton3) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } //一個示意性的商業方法 public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { Singleton3 single3 = Singleton3.getInstance(null); System.out.println(single3.about()); } } |
Maven 提供如下兩種類型插件:
類型 |
描述 |
構建插件 |
在生成過程當中執行,並在 pom.xml 中的<build/> 元素進行配置 |
報告插件 |
在網站生成期間執行,在 pom.xml 中的 <reporting/> 元素進行配置 |
如下是一些常見的插件列表:
插件 |
描述 |
clean |
編譯後的清理目標,刪除目標目錄 |
compiler |
編譯 Java 源文件 |
surefile |
運行JUnit單元測試,建立測試報告 |
jar |
從當前項目構建 JAR 文件 |
war |
從當前項目構建 WAR 文件 |
javadoc |
產生用於該項目的 Javadoc |
antrun |
從構建所述的任何階段運行一組 Ant 任務 |
下面是maven的
首先在pom.xml中添加: <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId> maven-project-info-reports-plugin </artifactId> </plugin> </plugins> </reporting>
若是用的是eclipse,那就用run as-build-在Goals那個框框裏輸入: project-info-reports:dependencies,若是實在dos環境下, 就mvn project-info-reports:dependencies。而後就會在target的文件夾下,生成一個site文件夾,裏邊有個dependency.html,進去就能看到詳細的依賴的信息。 或者直接在eclipse中打開pom.xml文件 會看到打開的窗口中有一個dependency hie開頭的選項卡。 這個選擇卡頁面左半部分顯示了詳細的jar包依賴樹。右半部分則是maven將會下載的jar包。 好比咱們看到右半部分有2個asm的jar,版本不一樣。 如今須要排除其中低版本的jar(好比xwork-core下的某個jar依賴的asm版本相對較低,不必定說是xwork-core依賴,而是它的依賴的依賴,即多重依賴的asm都是能夠的) <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> <version>${struts.version}</version> <exclusions> <exclusion> <artifactId>asm</artifactId> <groupId>asm</groupId> </exclusion> </exclusions> </dependency> 固然咱們也能夠在dependency hie開頭的選項卡中右半部分直接選中那個低版本的asm.jar。 而後右鍵exclude maven...點擊肯定會自動生成上面的。
|
若是你這個是步驟解決問題的步驟!在面試的時候我們是能夠用語言打動面試官的
maven引入依賴的時候,有的時候會發生循環依賴的狀況,形成依賴失敗,例如A依賴於B,B又依賴於C,C又依賴於A,形成一種環路,這樣的話會失敗。 假設依賴A依賴於B,D也依賴於B,B在pom中有2個版本B1,B2(有多是直接依賴,也有多是間接依賴),那麼maven會經過如下機制引入依賴: |
這樣面試官會認爲你真正作過開發,而且本身遇到這樣的問題!offer就在向你招手
將網站系統的web服務器、數據庫服務器、圖片和文件服務器分開,經過將服務器專業化分工,以提升網站訪問速度。由於圖片和文件在下載的時候不管是IIS、Apache等服務器都會有很大壓力。
能夠設置專門的數據緩存服務器,將大量數據放到緩存數據區,在訪問量少得時候存入數據,減小鏈接直接操做數據庫的開銷。
鏡像是大型網站常採用的提升性能和數據安全性的方式,鏡像的技術能夠解決不一樣網絡接入商和地域帶來的用戶訪問速度差別,好比ChinaNet和EduNet之間的差別就促使了不少網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這裏不闡述太深,有不少專業的現成的解決架構和產品可選。也有廉價的經過軟件實現的思路,好比Linux上的rsync等工具。
負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的高端解決辦法。
什麼是CDN? CDN的全稱是內容分發網絡。其目的是經過在現有的Internet中增長一層新的網絡架構,將網站的內 容發佈到最接近用戶的網絡「邊緣」,使用戶能夠就近取得所需的內容,提升用戶訪問網站的響應速度。
nginx的做用:1、http服務2、負載均衡3、解決高並發
這個在上課的時候老師是有文檔的!
Redis的做用: 1 、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2 、Redis支持數據的備份,即master-slave模式的數據備份。
3 、Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。
Redis經常使用數據類型
Redis最爲經常使用的數據類型主要有如下:
String
Hash
List
Set
Sorted set
pub/sub
Transactions
在建立session時能夠選擇開啓事務控制。所謂事務控制,即將消息生成發送,或接受,消費操做放入一個事務中。但不能同時控制發送與消費這一整個過程。由於事務都是基於一個session下的操做。 以下代碼即開啓了事務處理: ActiveMQSession session = connection.createSession(true,Session.CLIENT_ACKNOWLEDGE); 在事務狀態下進行發送操做,消息並未真正投遞到中間件,而只有進行session.commit操做以後,消息纔會發送到中間件,再轉發到適當的消費者進行處理。若是是調用rollback操做,則代表,當前事務期間內所發送的消息都取消掉。此時不管commit或rollback,會從新打開一個事務。 與此同時,在rollback以後,隨着新的事務打開,一些持久化的消息會從新接收。緣由在於當傳送模式處於持久話的狀態,產生的消息如若沒有被及時簽收確認,則消息會被中間件持久化。此時,當客戶端從新鏈接或新的事務開啓,消息會被再次發送到客戶端。 爲何commit以後,不會有持久的消息從新傳送呢? 緣由在於commit操做會自動將爲簽收確認的消息進行簽收確認,若是是當前接收但未簽收確認的消息,都會被確認處理。於是在commit以後不會有持久化的消息出現。
|
索引 Solr/Lucene採用的是一種反向索引,所謂反向索引:就是從關鍵字到文檔的映射過程,保存這種映射這種信息的索引稱爲反向索引
字段串列表和文檔編號鏈表二者構成了一個字典。如今想搜索」lucene」,那麼索引直接告訴咱們,包含有」lucene」的文檔有:2,3,10,35,92,而無需在整個文檔庫中逐個查找。若是是想搜既包含」lucene」又包含」solr」的文檔,那麼與之對應的兩個倒排表去交集便可得到:三、十、3五、92。 索引建立 假設有以下兩個原始文檔: 一:把原始文檔交給分詞組件(Tokenizer)
"Students","allowed","go","their","friends","allowed","drink","beer","My","friend","Jerry","went","school","see","his","students","found","them","drunk","allowed" 二:詞彙單元(Token)傳給語言處理組件(Linguistic Processor)
語言處理組件(linguistic processor)處理獲得的結果稱爲詞(Term),例子中通過語言處理後獲得的詞(Term)以下: "student","allow","go","their","friend","allow","drink","beer","my","friend","jerry","go","school","see","his","student","find","them","drink","allow"。 通過語言處理後,搜索drive時drove也能被搜索出來。Stemming 和 lemmatization的異同:
三:獲得的詞(Term)傳遞給索引組件(Indexer)
allow 2
them 2
對詞(Term) 「allow」來說,總共有兩篇文檔包含此詞(Term),詞(Term)後面的文檔鏈表總共有兩個,第一個表示包含」allow」的第一篇文檔,即1號文檔,此文檔中,」allow」出現了2次,第二個表示包含」allow」的第二個文檔,是2號文檔,此文檔中,」allow」出現了1次 至此索引建立完成,搜索」drive」時,」driving」,」drove」,」driven」也可以被搜到。由於在索引中,」driving」,」drove」,」driven」都會通過語言處理而變成」drive」,在搜索時,若是您輸入」driving」,輸入的查詢語句一樣通過分詞組件和語言處理組件處理的步驟,變爲查詢」drive」,從而能夠搜索到想要的文檔。 搜索步驟 搜索」microsoft job」,用戶的目的是但願在微軟找一份工做,若是搜出來的結果是:」Microsoft does a good job at software industry…」,這就與用戶的指望偏離太遠了。如何進行合理有效的搜索,搜索出用戶最想要得結果呢?搜索主要有以下步驟: 一:對查詢內容進行詞法分析、語法分析、語言處理
二:搜索索引,獲得符合語法樹的文檔集合 咱們把查詢語句也看做是一個文檔,對文檔與文檔之間的相關性(relevance)進行打分(scoring),分數高比較越相關,排名就越靠前。固然還能夠人工影響打分,好比百度搜索,就不必定徹底按照相關性來排名的。 如何評判文檔之間的相關性?一個文檔由多個(或者一個)詞(Term)組成,好比:」solr」, 「toturial」,不一樣的詞可能重要性不同,好比solr就比toturial重要,若是一個文檔出現了10次toturial,但只出現了一次solr,而另外一文檔solr出現了4次,toturial出現一次,那麼後者頗有可能就是咱們想要的搜的結果。這就引伸出權重(Term weight)的概念。 權重表示該詞在文檔中的重要程度,越重要的詞固然權重越高,所以在計算文檔相關性時影響力就更大。經過詞之間的權重獲得文檔相關性的過程叫作空間向量模型算法(Vector Space Model) 影響一個詞在文檔中的重要性主要有兩個方面:
空間向量模型 文檔中詞的權重看做一個向量 Document = {term1, term2, …… ,term N} Document Vector = {weight1, weight2, …… ,weight N} 把欲要查詢的語句看做一個簡單的文檔,也用向量表示: Query = {term1, term 2, …… , term N} Query Vector = {weight1, weight2, …… , weight N} 把搜索出的文檔向量及查詢向量放入N維度的空間中,每一個詞表示一維: 夾角越小,表示越類似,相關性越大
|
http://www.cnblogs.com/guochunguang/articles/3641008.html 這個裏面有一些解釋!lucene和solr的區別是在於:Solr是基於Lucene開發的全文檢索服務器,而Lucene就是一套實現了全文檢索的api,其本質就是一個全文檢索的過程。全文檢索就是把原始文檔根據必定的規則拆分紅若干個關鍵詞,而後根據關鍵詞建立索引,當查詢時先查詢索引找到對應的關鍵詞,並根據關鍵詞找到對應的文檔,也就是查詢結果,最終把查詢結果展現給用戶的過程。
|
TCP(Transmission Control Protocol) 傳輸控制協議 TCP是主機對主機層的傳輸控制協議,提供可靠的鏈接服務,採用三次握手確認創建一個鏈接: 位碼即tcp標誌位,有6種標示:SYN(synchronous創建聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急) Sequence number(順序號碼) Acknowledge number(確認號碼) 在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。 |
socket有幾種狀態
|
http是網絡上層協議。底層仍是socket短鏈接是發送數據時進行聯接。發送完關閉(咱們作完電商項目以後這些有了解一下) |
在ip網絡中,傳輸層主要協議是:tcp及udp。在web中,應用層也用http傳輸。 在網絡io中,目前主要有:bio(阻塞)、nio(非阻塞)、aio(異步jdk7中新特性)。具體不做解析能夠看相關文檔。 在傳輸中應用層的協議及規範主要有: RMI(java原生的),用java自身的序列化技術。 xml-rpc 用xml+http Binary-RPC 用二進制+http soap,能夠說是xml-rpc的一種封裝 COBRA,加入了jdk中 jms,這個是一種規範,基於隊列模型的 主要的實現框架,能夠組合使用。 activeMQ:是jms的一種實現 mina:基本是包裝了nio.Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily。It provides an abstract · event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO. Hessian:Hessian是一個輕量級的remoting onhttp工具.採用的是二進制RPC協議,由於採用的是二進制協議,因此它很適合於發送二進制數據.本身實現序列化。 Burlap:和Hessian差很少,基於xml-RPC的實現 mule esb: 直接看官方文檔http://www.mulesoft.org/ 基於總線模型 spring-Remoting 重量級的 Jboss-Remoting 重量及的 EJB3
|
16、redis集羣中,某個節點宕機怎麼辦?你碰見過嗎?你的解決思路是什麼?
redis集羣:通常的是至少是2臺服務器,主從服務器!若是redis集羣的主服務器掛了,沒有關係還有備服務器
Mybatis和hibernate不一樣,它不徹底是一個ORM框架,由於MyBatis須要程序員本身編寫Sql語句,不過mybatis能夠經過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。
Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,由於這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。可是靈活的前提是mybatis沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件則須要自定義多套sql映射文件,工做量大。
Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件(例如需求固定的定製化軟件)若是用hibernate開發能夠節省不少代碼,提升效率。可是Hibernate的缺點是學習門檻高,要精通門檻更高,並且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate須要具備很強的經驗和能力才行。
總之,按照用戶的需求在有限的資源環境下只要能作出維護性、擴展性良好的軟件架構都是好架構,因此框架只有適合纔是最好。
觀察者模式又叫作發佈-訂閱(Publish/Subscribe)模式。觀察者模式定義了一種一對多地依賴模式,讓多個觀察者同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知全部的觀察者對象,使它們可以自動更新本身。這裏的主題對象就是指通知者,又叫作發佈者。觀察者又叫訂閱者。
若是不基於註解: 該類須要繼承 CommandController 或者 其餘不少 參見 spring幫助
若是基於註解:在類名前 加上 @controller
補充:將類名前加上該註解,當spring啓動 或者web服務啓動 spring會自動掃描全部包(固然,這個能夠設置)
做用: 就是告訴服務器 這個類是MVC中的C 這個類能夠接收用戶請求 處理用戶請求
常見的設計模式:單例模式、工廠模式、觀察者模式、裝飾模式與適配器模式、橋接模式、代理模式
spring支持編程式事務管理和聲明式事務管理兩種方式。
編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。
聲明式事務管理創建在AOP之上的。其本質是對方法先後進行攔截,而後在目標方法開始以前建立或者加入一個事務,在執行完目標方法以後根據執行狀況提交或者回滾事務。聲明式事務最大的優勢就是不須要經過編程的方式管理事務,這樣就不須要在業務邏輯代碼中摻瑣事務管理的代碼,只需在配置文件中作相關的事務規則聲明(或經過基於@Transactional註解的方式),即可以將事務規則應用到業務邏輯中。
顯然聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式。聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上註解就能夠得到徹底的事務支持。和編程式事務相比,聲明式事務惟一不足地方是,後者的最細粒度只能做用到方法級別,沒法作到像編程式事務那樣能夠做用到代碼塊級別。可是即使有這樣的需求,也存在不少變通的方法,好比,能夠將須要進行事務管理的代碼塊獨立爲方法等等。
聲明式事務管理也有兩種經常使用的方式,一種是基於tx和aop名字空間的xml配置文件,另外一種就是基於@Transactional註解。顯然基於註解的方式更簡單易用,更清爽。
http://blog.csdn.net/xianfajushi/article/details/50133965
1、 爲何要進行中文分詞?
詞是最小的可以獨立活動的有意義的語言成分,英文單詞之間是以空格做爲天然分界符的,而漢語是以字爲基本的書寫單位,詞語之間沒有明顯的區分標記,所以,中文詞語分析是中文信息處理的基礎與關鍵。
Lucene中對中文的處理是基於自動切分的單字切分,或者二元切分。除此以外,還有最大切分(包括向前、向後、以及先後相結合)、最少切分、全切分等等。
IK分析器的分詞原理本質上是詞典分詞。如今內存中初始化一個詞典,而後在分詞過程當中逐個讀取字符,和字典中的字符相匹配,把文檔中的全部的詞語拆分出來的過程。
把項目打成war包發在服務器裏面,直接運行
1、Java基礎
1.String類爲何是final的。
2.HashMap的源碼,實現原理,底層結構。
3.反射中,Class.forName和classloader的區別
4.session和cookie的區別和聯繫,session的生命週期,多個服務部署時session管理。
5.Java中的隊列都有哪些,有什麼區別。
6.Java的內存模型以及GC算法
7.Java7、Java8的新特性
8.Java數組和鏈表兩種結構的操做效率,在哪些狀況下(從開頭開始,從結尾開始,從中間開始),哪些操做(插入,查找,刪除)的效率高
9.Java內存泄露的問題調查定位:jmap,jstack的使用等等
2、框架
1.struts1和struts2的區別
Struts 1要求Action類要擴展自一個抽象基類。Struts 1的一個共有的問題是面向抽象類編程而不是面向接口編程。
|
①springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。 ②springmvc是基於方法開發,傳遞參數是經過方法形參,能夠設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是經過類的屬性,只能設計爲多例。 ④ Struts2有漏洞,springmvc目前尚未漏洞出現。若是使用struts2,建議下載最新包。
|
3.spring框架中須要引用哪些jar包,以及這些jar包的用途
Spring3.X之後jar包進行了重構,取消了原來2.X版本中的總的spring.jar包,而是把總包中的功能所有分開打包。正在向osgi靠攏。
作Spring還必須依賴第三方包: ① Spring 工程依賴的公共包 ② 使用SpringAOP功能時依賴的包 ③ 使用SpringJDBC功能時依賴的包
|
4.srpingMVC的原理
1. 客戶端請求提交到DispatcherServlet 2. 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找處處理請求的Controller 3. DispatcherServlet將請求提交到Controller 4. Controller調用業務邏輯處理後,返回ModelAndView 5. DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖 6. 視圖負責將結果顯示到客戶端 DispatcherServlet是整個Spring MVC的核心。它負責接收HTTP請求組織協調Spring MVC的各個組成部分。其主要工做有如下三項: 1. 截獲符合特定格式的URL請求。
|
|
|
|
是經過AOP對配置的方法進行欄截,而後再調用事務管理器中的預設代碼對事務進行管理,再委託被攔截方法完成原有的任務。
9.springIOC和AOP的原理
10.hibernate中的1級和2級緩存的使用方式以及區別原理
11.spring中循環注入的方式
什麼是循環注入?舉個列子我有一個類A,A有一個構造器裏面的參數是類B,而後類B裏面有個構造器參數是類C,類C裏面有個構造器參數是類A,就是咱們會發現其實引用循環了A 裏面有B的引用,B裏面有C的引用,C裏面又有A的引用。
循環依賴又分爲構造器循環依賴和set循環依賴: 首先講一下構造器的循環依賴:
1:spring建立A首先去當前建立池中去查找當前A是否在建立,若是發明沒有建立則準備其構造器須要的參數B,而後把建立A的標識放入當前建立池中。 2:spring建立B首先去當前建立池中去查找當前B是否在建立,若是發現沒有建立則準備其構造器須要的參數C,而後把建立B的標識放入當前建立池中。 3:spring建立C首先去當前建立池中去查找當前C是否在建立,若是發現沒有建立則準備其構造器須要的參數A,而後把建立C的標識放入當前建立池中。 4:spring建立C須要的A,這個時候會發如今當前建立池中已經有A的標識,A正在建立中則拋出BeanCurrentlyInCreationException。 構造器的循環注入是沒有辦法解決的,因此只能咱們避免.
接下來看下set方式的循環注入: 先看第一種狀況,仍是拿上面的ABC3個類來講明問題,只不過此次不是構造器裏面的參數,而是換成他們的成員變量,而後經過set方式類注入,這裏代碼就不寫了直接講下: 單列下set方式的注入流程是這樣的: 1:spring建立A,首先根據其無參構造器建立一個對象A,而後提早暴露出建立出來的這個A對象,而後再當前的建立池中放入建立A的標識,而後進行set方法注入B。 2:spring建立B,首先根據其無參構造器建立一個對象B,而後提早暴露出建立出來的這個B對象,而後在當前的建立池中放入建立B的標識,而後進行set方法的注入C。 3:spring建立C,首先根據其無參構造器建立一個對象C,而後提早暴露出建立處理的這個C對象,而後在當前的建立池中放入建立C的標識,而後進行set方法的注入A。 4:在第三步注入A的時候因爲提早暴露出來了建立出來的A對象因此不會報BeanCurrentlyInCreationException的錯誤。 多列下set方式的循環注入不能解決的緣由是在多列的狀況下,當建立對象的時候spring不會提早暴露建立處理的對象A,這樣的話則會和構造器循環注入出現同樣的狀況最終致使報錯
|
3、多線程
1.Java建立線程以後,直接調用start()方法和run()的區別
Thread類中run()和start()方法的區別以下:
當你調用start()方法時你將建立新的線程,而且執行在run()方法裏的代碼。可是若是你直接調用run()方法,它不會建立新的線程也不會執行調用線程的代碼
|
http://blog.163.com/wm_at163/blog/static/132173490201242984518354/
3.newFixedThreadPool此種線程池若是線程數達到最大值後會怎麼辦,底層原理。
4.多線程之間通訊的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關不少的具體問題,例如同一個類不一樣方法都有synchronized鎖,一個對象是否能夠同時訪問。或者一個類的static構造方法加上synchronized以後的鎖的影響。
5.瞭解可重入鎖的含義,以及ReentrantLock 和synchronized的區別
6.同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲何他是同步的且效率高
7.atomicinteger和volatile等線程安全操做的關鍵字的理解和使用
8.線程間通訊,wait和notify
9.定時線程的使用
10.場景:在一個主線程中,要求有大量(不少不少)子線程執行完以後,主線程才執行完成。多種方式,考慮效率。
4、網絡通訊
1.http是無狀態通訊,http的請求方式有哪些,能夠本身定義新的請求方式麼。
2.socket通訊,以及長鏈接,分包,鏈接異常斷開的處理。
3.socket通訊模型的使用,AIO和NIO。
4.socket框架netty的使用,以及NIO的實現原理,爲何是異步非阻塞。
5.同步和異步,阻塞和非阻塞。
5、Linux
1.經常使用的linux下的命令
2.大的log文件中,統計異常出現的次數、排序,或者指定輸出多少行多少列的內容。(主要考察awk)
3.linux下的調查問題思路:內存、CPU、句柄數、過濾、查找、模擬POST和GET請求等等場景
4.shell腳本中#!的做用
6、數據庫MySql
1.MySql的存儲引擎的不一樣
2.單個索引、聯合索引、主鍵索引
3.Mysql怎麼分表,以及分表後若是想按條件分頁查詢怎麼辦(若是不是按分表字段來查詢的話,幾乎效率低下,無解)
4.分表以後想讓一個id多個表是自增的,效率實現
5.MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6.寫SQL語句。。。
7.索引的數據結構,B+樹
8.事物的四個特性,以及各自的特色(原子、隔離)等等,項目怎麼解決這些問題
7、設計模式(寫代碼)
1.單例模式:飽漢、餓漢。以及餓漢中的延遲加載
2.工廠模式、裝飾者模式、觀察者模式。
8、算法
1.使用隨機算法產生一個數,要求把1-1000W之間這些數所有生成。(考察高效率,解決產生衝突的問題)
2.兩個有序數組的合併排序
3.一個數組的倒序
4.計算一個正整數的正平方根
5.說說常見的查找排序算法
9、緩存
1.爲何用緩存,用過哪些緩存,redis和memcache的區別
2.redis的數據結構
3.redis的持久化方式,以及項目中用的哪一種,爲何
4.redis集羣的理解,怎麼動態增長或者刪除一個節點,而保證數據不丟失。
贏在格局,不失風雅。