一您朽、引言?
畢業(yè)已經一年有余狂丝,這一年里特別感謝技術管理人員的器重,以及同事的幫忙哗总,學到了不少東西几颜。這一年里走過一些彎路,也碰到一些難題魂奥,也受到過做為一名開發(fā)卻經常為系統(tǒng)維護和發(fā)布當救火隊員的苦惱菠剩。遂決定梳理一下自己所學的東西,為大家分享一下耻煤。?
經過一年意識到以前也有很多認識誤區(qū)具壮,比如:
偏愛收集,經常收集各種資料視頻塞滿一個個硬盤哈蝇,然后心滿意足的看著容量不行動棺妓。
不重基礎,總覺得很多基礎東西不需要再看了炮赦,其實不懂的地方很多怜跑,計算機程序方面任何一個結果都必有原因,不要只會用不知道原理,那是加工廠出來的⌒苑遥現在ide查看代碼那么方便峡眶,ctrl+點擊就進入了JDK查看實現細節(jié)。
好高騖遠植锉,在計算機基礎不牢固的情況下辫樱,總想著要做架構,弄分布式俊庇,搞大數據之類狮暑。
不重視性能,只求能實現功能辉饱,sql查詢是不是可以優(yōu)化搬男,是否有算法妙用,大對象是否要清除彭沼。
不重視擴展性缔逛,模塊之間緊密耦合,常用方法不提取成工具類溜腐,調用關系混亂等問題译株。
……
本文重點不在這些,故只列舉了一小部分挺益,下面進入正題歉糜。
小編推薦一個學java的學習裙【 374320282 】,無論你是大牛還是小白望众,是想轉行還是想入行都可以來了解一起進步一起學習匪补!裙內有開發(fā)工具,很多干貨和技術資料分享烂翰!
二夯缺、語法基礎
2.1 Java類初始化順序?
這是所有情況的類初始化順序,如果實際類中沒有定義則跳過:父類靜態(tài)變量——父類靜態(tài)代碼塊——子類靜態(tài)代碼塊——父類非靜態(tài)變量——父類非靜態(tài)代碼塊——父類構造函數——子類非靜態(tài)變量——子類非靜態(tài)代碼塊——子類構造函數
2.2 值傳遞和引用傳遞?
可能很多人對此不屑一顧甘耿,心想老子都工作一年了踊兜,對這些還不熟悉嗎?但實際情況并非這樣佳恬,JDK中東西全部熟悉了嗎捏境?以一個最簡單的例子開始,你覺得下圖中代碼執(zhí)行完之后fatherList中的元素是什么毁葱??
這是一個最基礎的值傳遞和引用傳遞的例子垫言,你覺得好簡單,已經想躍躍欲試的挑戰(zhàn)了倾剿,那么請看下面的筷频,StringBuffer很好理解,但是當你執(zhí)行一遍之后發(fā)現是不是和預想中的輸出不一樣呢?String不是引用類型嗎凛捏,怎么會這樣呢担忧?如果你無法理解,那么請看下String的實現源碼葵袭,了解下其在內存中分配的實現原理涵妥。?
2.3 集合的使用?
這部分幾乎每個人都會用到乖菱,而且大家還都不陌生坡锡。下圖來源于互聯網,供大家復習一下窒所。但是利用集合的特性進行巧妙的組合運用能解決優(yōu)化很多復雜問題鹉勒。Set不可重復性,List的順序性吵取,Map的鍵值對禽额,SortSet/SortMap的有序性,我在工作中有很多復雜的業(yè)務都巧妙的使用了這些皮官,涉及到公司保密信息脯倒,我就不貼出代碼了。工作越久越發(fā)現這些和越巧妙捺氢。?
2.3 異常處理?
1.看著try藻丢、catch、finally非常容易摄乒,如果和事務傳播結合在一起悠反,就會變得極其復雜。
2.finally不一定必須執(zhí)行馍佑,return在catch/finally中處理情況(建議親自操刀試一下)斋否。
3.catch中可以繼續(xù)拋自定義異常(并把異常一步步傳遞到控制層,利用切面抓取封裝異常拭荤,返回給調用者)茵臭。
2.4 面向對象思想?
一提起面向對象,大家都知道抽象舅世、封裝旦委、繼承、和多態(tài)歇终。但是實際工作經驗中又知道多少呢社证,對于項目中如何巧用估計更不要提了。
共性的機會每個都需要用的建立基類评凝,如每個控制層方法可能要通過security獲取一個登錄用戶id追葡,用于根據不同的用戶操作不同的數據,可以抽象出一個應用層基類,實現獲取id的protect方法宜肉。同理DAO層可以利用泛型提取出一個包含增刪改查的基類匀钧。
多態(tài)的Override:基類的引用變量不僅可以指向基類的實例對象,也可以指向其子類的實例對象谬返,如果指向子類的實例對象之斯,其調用的方法應該是正在運行的那個對象的方法。在策略模式中使用很普遍遣铝。
提到面向對象佑刷,就不可避免的要說設計模式,在工作中酿炸,一個技術大牛寫的一個類似策略模式(更復雜一點)瘫絮,十分巧妙的解決了各種業(yè)務同一個方法,并且實現了訂單填硕、工單麦萤、業(yè)務的解耦,看得我是非常佩服扁眯。我想很多面試中都會問道單例模式吧壮莹,還沒有理解的建議去看一看。
三姻檀、多線程
3.1 線程安全?
這個是老生常談的問題了命满,但是確實是問題和bug高發(fā)區(qū)。線程同步問題不需要單獨寫了施敢,想必大家都清楚周荐,不太熟悉的建議百度一下。
3.1.1 線程安全問題?
1.代碼中如果有同步操作僵娃,共享變量要特別注意(這個一般都能意識到)
2多個操作能修改數據表中同一條數據的概作。(這個容易被忽略,業(yè)務A可能操作表a默怨,業(yè)務B也可以操作表a讯榕,業(yè)務A、B即使在不同的模塊和方法中匙睹,也會引起線程安全問題愚屁。例如如果一個人訪問業(yè)務A接口,另一個人訪問業(yè)務B接口痕檬,在web中每個業(yè)務請求都是會有單獨的一個線程進行處理的霎槐,就會出現線程安全問題)。
3.不安全的類型使用梦谜,例如StringBuffer丘跌、StringBuild袭景,HashTable、HashMap等闭树。在工作中我就遇到過有人在for循環(huán)進行l(wèi)ist的remove耸棒,雖然編譯器不報錯,程序可以運行报辱,但是結果卻可想而知与殃。
4.Spring的bean默認是單例的,如果有類變量就要特別小心了(一般情況下是沒人在控制層碍现、業(yè)務層幅疼、DAO層等用類變量的,用的話建議是final類型鸵赫,例如日志log衣屏,gson等)。
5.多個系統(tǒng)共享數據庫情況辩棒,這個其實和分布式系統(tǒng)類似
用戶重復提交問題(即使代碼中從數據庫讀取是否存在進行限制不能解決問題)
3.1.2 線程安全解決?
在需要同步的地方采用安全的類型。
JDK鎖機制膨疏,lock一睁、tryLock,synchronized佃却,wait者吁、notify、notifyAll等
Concurrent并發(fā)工具包饲帅,在處理一些問題上复凳,誰用誰知道。強烈建議查看源碼灶泵!
數據表加鎖育八。(除非某個表的訪問頻率極低,否則不建議使用)
涉及分布式的赦邻,采用中間件技術例如zookeeper等解決髓棋。
3.2 異步?
異步使用場景不影響主線程,且響應較慢的業(yè)務惶洲。例如IO操作按声,第三方服務(短信驗證碼、app推送恬吕、云存儲上傳等)签则。
如果異步任務很多,就需要使用任務隊列了铐料,任務隊列可以在代碼級別實現渐裂,也可以利用redis(優(yōu)勢太明顯了)侨颈。
3.3 多線程通信
這方面文章非常多,這里不在詳述芯义。
1.共享變量方式(共享文件哈垢、全局變量,信號量機制等)
2.消息隊列方式
3. 忙等扛拨,鎖機制
3.4多線程實現?
1.集成Thread類耘分,重寫(這里的重寫指的是override)run方法,調用start方法執(zhí)行绑警。
2.實現Runable接口求泰,實現run方法,以Runable實例創(chuàng)建thread對象计盒。
3.實現Callable接口渴频,實現call方法,FutureTask包裝callable接口北启,FutureTask對象創(chuàng)建thread對象卜朗,常用語異步操作,建議使用匿名內部類咕村,方便閱讀和使用场钉。
額外需要說明的是:
1.理解thread的join方法;
2.不要認為volitate是線程安全的(不明白原因的建議去看jvm運行時刻內存分配策略)懈涛;
3.sleep時間片結束后并不保證立馬獲取cpu逛万。
4.ThreadLocal能夠為每一個線程維護變量副本,常用于在多線程中用空間換時間批钠。
四宇植、開源框架
4.1 Hibernate、Mybatis?
相信每一個java程序員對這些都不陌生埋心,這里不再詳述指郁。
需要說明的主要以下幾點:
1.hibernate一級緩存(內置session緩存),二級緩存(可裝配sessionFactory緩存)踩窖,二級緩存會引起并發(fā)問題坡氯。?
2.hibernate延遲加載原理理解。
3.hibernate 的get洋腮、load方法箫柳,sava、persist啥供、savaOrUpdate方法區(qū)別?
4.session重建了關聯關系卻并沒有同數據庫進行同步和更新
5.hibernate session關聯關系:detached對象悯恍、persistent對象
6.Spring data集成,注解方式配置屬性和實體伙狐。
7.mybatis 插件涮毫。
8.分頁查詢(數據庫)瞬欧。
9.連接池技術
4.2 Spring IOC
4.1.1 Spring bean?
1.bean注入 注解方式方便易讀,引用第三方(數據庫連接罢防,數據庫連接池艘虎,JedisPool等)采用配置文件方式。
2. bean作用域:Singleton咒吐,prototype野建,request,session恬叹,global session
3.bean生命周期:如下圖所示(圖片來源于互聯網):
4.3 Spring AOP?
基本概念:關注點候生、切面Aspect、切入點pointcut绽昼、連接點joinpoint唯鸭、通知advice、織入weave硅确、引入introduction目溉。
Spring AOP支持5中類型通知,分別是MethodBeforeAdvice疏魏、AfterReturningAdvice停做、ThrowsAdvice、MethodInterceptor大莫、IntroductionInterceptor(吐槽一下名字太長)
實現方式如下:
1.基于代理的AOP
2.基于@Aspect注解驅動的切面。(強烈推薦:可讀性好官份,易維護只厘,易擴展,開發(fā)快)?
3.純POJO切面舅巷。
4.注入式Aspect切面羔味。
4.4 Srping事務?
4.4.1 事務傳播?
概念:某些操作需要保證原子性,如果中間出錯钠右,需要事務回滾赋元。如果某個事務回滾,那么調用該事務的方法中的事務的作出如何的動作飒房,就是事務傳播搁凸。
短時間內寫不清楚,
建議訪問問?http://www.cnblogs.com/yangy608/archive/2010/12/15/1907065.html?查看狠毯。
事務傳播屬性:
1. PROPAGATION_REQUIRED–支持當前事務护糖,如果當前沒有事務,就新建一個事務嚼松。這是最常見的選擇嫡良。
2. PROPAGATION_SUPPORTS–支持當前事務锰扶,如果當前沒有事務,就以非事務方式執(zhí)行寝受。?
3. PROPAGATION_MANDATORY–支持當前事務坷牛,如果當前沒有事務,就拋出異常很澄。
4. PROPAGATION_REQUIRES_NEW–新建事務京闰,如果當前存在事務,把當前事務掛起痴怨。
5. PROPAGATION_NOT_SUPPORTED–以非事務方式執(zhí)行操作忙干,如果當前存在事務,就把當前事務掛起。
6. PROPAGATION_NEVER–以非事務方式執(zhí)行,如果當前存在事務吓笙,則拋出異常茶宵。
事務隔離級別:
1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別奖地,充許令外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀赞哗。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀辆雾,不可重復讀肪笋。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外度迂,還保證了避免下面的情況產生(不可重復讀)藤乙。
5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執(zhí)行惭墓。除了防止臟讀坛梁,不可重復讀外,還避免了幻像讀腊凶。
4.5 其他Spring 技術棧
spring boot 輕量級啟動框架
spring security 用戶權限管理划咐,根據角色和用戶,實現UserDetailsService钧萍,進行自定義權限管理褐缠。
spring task 代碼級定時任務,注解方式划煮,使用起來非常方便送丰。需要注意的是,如果某次定時任務出了異常而沒有進行處理弛秋,會導致接下來定時任務失效器躏。如果各個任務相互獨立俐载,可以簡單用try,catch包圍(之前就吃過這方面的虧)登失。
spring data 注解方式定義實體遏佣,屬性等
spring mvc 簡單明了的mvc框架。url傳值揽浙、數組傳值状婶、對象傳值、對象數組等傳值類型馅巷,上傳/下載文件類型需要注意膛虫。
spring restful 注意命名,對命名要求很嚴格钓猬。
spring shell 命令行方式執(zhí)行命令稍刀,救火、導入導出數據等用起來非常方便敞曹、制作報表账月。
五、Web基礎
5.1 web容器啟動?
1.web.xml加載順序: listener -> filter -> servlet
2.webt容器啟動過程澳迫,java新手很怕配置文件局齿,理解完這些有助于熟悉配置文件http://blog.csdn.net/u014431852/article/details/47042895
5.2 Servlet、Interceptor橄登、Listener抓歼、Filter?
Servlet 接收請求返回響應,最原始的web業(yè)務處理類拢锹。
Interceptor 攔截器锭部,可以實現HandlerInterceptor接口自定義攔截器,在日志記錄面褐、權限檢查、性能監(jiān)控取胎、通用行為等場景使用展哭,本質是AOP。
Listener 監(jiān)聽器 常用于統(tǒng)計在線人數等縱向功能闻蛀。
Filter 過濾器 在請求接口處理業(yè)務之前改變requset匪傍,在業(yè)務處理之后響應用戶之前改變response。如果某些數據不加密觉痛,很容易用抓包工具加filter作弊役衡。
5.3 web項目結構?
5.3.1 mvn結構?
熟練掌握幾種常見的mvn項目結構,mvn可以自動生成薪棒,這里不再詳述手蝎。
5.3.2 mvn包管理?
1.版本號盡量幾種在一個文件中便于管理榕莺。
2.spring milestone包解決spring包沖突問題。
3.mvn dependency:tree命令分析所有包依賴棵介,對于沖突的在pom文件中 包圍起來
5.3.3 版本控制
1.git钉鸯、svn等
2.代碼沖突解決方案
3.分支管理。
對于某個穩(wěn)定版本上線后邮辽,如果在此基礎上開發(fā)新功能唠雕,一定要新建分支,在新分支上提交代碼吨述,最后在新版發(fā)布時合并分支岩睁。修改運營環(huán)境bug切換到主分支進行修改
5.4 Http請求?
5.4.1 請求方法?
post、get揣云、put捕儒、head、delete灵再、copy肋层、move、connect翎迁、link栋猖、patch,最常用的是前4汪榔、5個蒲拉。
5.4.2 請求頭,狀態(tài)碼
常用的請求頭有Accept(下載文件會特殊使用)痴腌、Accept-Charset(設置utf-8字符集)雌团、Content-Type(json等配置)等
常用的響應頭有Content-Type、Content-Type士聪、Content-Length等锦援,偏前端,不再詳述剥悟。
六灵寺、系統(tǒng)架構
接觸的不是特別多,目前用到的只是服務器主從備份区岗。Nginx反向代理進行配置略板。
多個項目nginx配置
Spring Mvc 用json數據進行交互,配置json轉換的servlet慈缔。
封裝返回值
自定義RunEnvironmentException(狀態(tài)碼叮称,原因),覆蓋原有Exception,切面ExceptionHandler抓取Exception并封裝到返回值中(前后端松耦合)
令人頭疼的用戶重復(連續(xù)快速點擊)提交問題瓤檐,前端限制治標不治本赂韵;后端用sessonid在切面上實現,又需要前端存儲距帅,對所有請求數據加sessionId右锨。最后用jedis中存儲,用接口名+用戶名當做key碌秸,根據不同的接口對不同的key可以單獨設置時間绍移,不僅保證了重復提交問題,也避免了惡意請求問題讥电,同時還能自定義請求間隔蹂窖。(期初擔心redis緩存讀寫時間延誤導致限制失效,后來發(fā)現多慮了恩敌,對一般的小系統(tǒng)來說瞬测,經性能測試,發(fā)現即使請求頻率再提高100被也不會導致限制失效)
testNg單元測試纠炮、性能測試月趟,覆蓋測試。
切面管理日期恢口、權限孝宗。緩存等。
七耕肩、 Nosql
1.Redis的java庫Jedis因妇。?
Jedispool配置。
項目中用到的有任務隊列猿诸、緩存婚被。
2. neo4j圖數據庫?
處理社交、推薦
八梳虽、服務端
linux操作系統(tǒng)熟悉以centos為例:?
常用簡單命令:ssh址芯、vim、scp窜觉、ps是复、gerp、sed竖螃、awk、cat逗余、tail特咆,df、top,shell腻格、chmod画拾、sh、tar菜职、find青抛、wc、ln酬核、|
目錄結構明細:/etc/蜜另、~/、/usr/嫡意、/dev/举瑰、/home/、/etc/init.d/
服務端:jdk蔬螟、tomcat此迅、nginx、mysql旧巾、jedis耸序、neo4j啟動與配置(特別說明的是該死的防火墻,nginx啟動后一直訪問不了鲁猩,查找一下午查不到原因坎怪,最后發(fā)現是防火墻問題)
監(jiān)控服務器狀態(tài)(cpu,磁盤绳匀,內存)芋忿,定位pid,日志查看
nginx負載均衡疾棵、反向代理戈钢、配置
自動化部署腳本
簡單shell腳本書寫,避免大量人力勞動是尔。
監(jiān)控系統(tǒng)殉了,代碼拋fatal異常自動發(fā)郵件,系統(tǒng)指標持續(xù)偏高自動發(fā)郵件拟枚。
九薪铜、第三方接口對接
9.1 支付接口?
微信支付坑比較多,用將近兩周時間才把微信支付所有完成恩溅。需要在微信后臺配置的地方太多隔箍。
而支付寶支付模塊只用了2天時間就搞定了。
9.2 推送接口?
為用戶定義tag脚乡、定義alias蜒滩,注意當數據更新時需要同步更新tag、更新alias。如果沒采用異步實現(用戶體驗就是好卡案┘琛)
9.3 云存儲?
大量文件上傳云端(七牛云)捡遍,注意創(chuàng)建bucket?
9.4 短信驗證?
很簡單的第三方接口,引入依賴竹握,直接調用即可画株。需要在第三方后臺設置模板等,注意限定用戶訪問次數啦辐。
9.5 郵件?
很簡單小功能谓传,工具類。
時間有限昧甘,目前先寫這么多技術棧良拼。