Java後端程式員1年工作經驗總結

来源:http://www.cnblogs.com/aishangJava/archive/2017/09/13/7513377.html
-Advertisement-
Play Games

java後端1年經驗和技術總結(1) 1.引言 畢業已經一年有餘,這一年裡特別感謝技術管理人員的器重,以及同事的幫忙,學到了不少東西。這一年裡走過一些彎路,也碰到一些難題,也受到過做為一名開發卻經常為系統維護和發佈當救火隊員的苦惱。遂決定梳理一下自己所學的東西,為大家分享一下。 經過一年意識到以前也 ...


java後端1年經驗和技術總結(1)

1.引言

  畢業已經一年有餘,這一年裡特別感謝技術管理人員的器重,以及同事的幫忙,學到了不少東西。這一年裡走過一些彎路,也碰到一些難題,也受到過做為一名開發卻經常為系統維護和發佈當救火隊員的苦惱。遂決定梳理一下自己所學的東西,為大家分享一下。

  經過一年意識到以前也有很多認識誤區,比如:

  偏愛收集,經常收集各種資料視頻塞滿一個個硬碟,然後心滿意足的看著容量不行動。

  不重基礎,總覺得很多基礎東西不需要再看了,其實不懂的地方很多,電腦程式方面任何一個結果都必有原因,不要只會用不知道原理,那是加工廠出來的。現在ide查看代碼那麼方便,ctrl+點擊就進入了JDK查看實現細節。

  好高騖遠,在電腦基礎不牢固的情況下,總想著要做架構,弄分散式,搞大數據之類。

  不重視性能,只求能實現功能,sql查詢是不是可以優化,是否有演算法妙用,大對象是否要清除。

  不重視擴展性,模塊之間緊密耦合,常用方法不提取成工具類,調用關係混亂等問題。

  ……

  本文重點不在這些,故只列舉了一小部分,下麵進入正題。

2.語法基礎

 2.1 Java類初始化順序

  這是所有情況的類初始化順序,如果實際類中沒有定義則跳過:父類靜態變數——父類靜態代碼塊——子類靜態代碼塊——父類非靜態變數——父類非靜態代碼塊——父類構造函數——子類非靜態變數——子類非靜態代碼塊——子類構造函數

 2.2 值傳遞和引用傳遞

  可能很多人對此不屑一顧,心想老子都工作一年了,對這些還不熟悉嗎?但實際情況並非這樣,JDK中東西全部熟悉了嗎?以一個最簡單的例子開始,你覺得下圖中代碼執行完之後fatherList中的元素是什麼?

  這是一個最基礎的值傳遞和引用傳遞的例子,你覺得好簡單,已經想躍躍欲試的挑戰了,那麼請看下麵的,StringBuffer很好理解,但是當你執行一遍之後發現是不是和預想中的輸出不一樣呢?String不是引用類型嗎,怎麼會這樣呢?如果你無法理解,那麼請看下String的實現源碼,瞭解下其在記憶體中分配的實現原理。

 2.3 集合的使用

  這部分幾乎每個人都會用到,而且大家還都不陌生。下圖來源於互聯網,供大家複習一下。但是利用集合的特性進行巧妙的組合運用能解決優化很多複雜問題。Set不可重覆性,List的順序性,Map的鍵值對,SortSet/SortMap的有序性,我在工作中有很多複雜的業務都巧妙的使用了這些,涉及到公司保密信息,我就不貼出代碼了。工作越久越發現這些和越巧妙。

 

 2.3 異常處理

  1.看著try、catch、finally非常容易,如果和事務傳播結合在一起,就會變得極其複雜。

  2.finally不一定必須執行,return在catch/finally中處理情況(建議親自操刀試一下)。

  3.catch中可以繼續拋自定義異常(並把異常一步步傳遞到控制層,利用切麵抓取封裝異常,返回給調用者)。

 2.4 面向對象思想

  一提起面向對象,大家都知道抽象、封裝、繼承、和多態。但是實際工作經驗中又知道多少呢,對於項目中如何巧用估計更不要提了。

  共性的機會每個都需要用的建立基類,如每個控制層方法可能要通過security獲取一個登錄用戶id,用於根據不同的用戶操作不同的數據,可以抽象出一個應用層基類,實現獲取id的protect方法。同理DAO層可以利用泛型提取出一個包含增刪改查的基類。

  多態的Override:基類的引用變數不僅可以指向基類的實例對象,也可以指向其子類的實例對象,如果指向子類的實例對象,其調用的方法應該是正在運行的那個對象的方法。在策略模式中使用很普遍。

  提到面向對象,就不可避免的要說設計模式,在工作中,一個技術大牛寫的一個類似策略模式(更複雜一點),十分巧妙的解決了各種業務同一個方法,並且實現了訂單、工單、業務的解耦,看得我是非常佩服。我想很多面試中都會問道單例模式吧,還沒有理解的建議去看一看。

 

3.多線程

 3.1 線程安全

  這個是老生常談的問題了,但是確實是問題和bug高發區。線程同步問題不需要單獨寫了,想必大家都清楚,不太熟悉的建議百度一下。

 3.1.1 線程安全問題

  1.代碼中如果有同步操作,共用變數要特別註意(這個一般都能意識到)

  2多個操作能修改數據表中同一條數據的。(這個容易被忽略,業務A可能操作表a,業務B也可以操作表a,業務A、B即使在不同的模塊和方法中,也會引起線程安全問題。例如如果一個人訪問業務A介面,另一個人訪問業務B介面,在web中每個業務請求都是會有單獨的一個線程進行處理的,就會出現線程安全問題)。

  3.不安全的類型使用,例如StringBuffer、StringBuild,HashTable、HashMap等。在工作中我就遇到過有人在for迴圈進行list的remove,雖然編譯器不報錯,程式可以運行,但是結果卻可想而知。

  4.Spring的bean預設是單例的,如果有類變數就要特別小心了(一般情況下是沒人在控制層、業務層、DAO層等用類變數的,用的話建議是final類型,例如日誌log,gson等)。

  5.多個系統共用資料庫情況,這個其實和分散式系統類似

  用戶重覆提交問題(即使代碼中從資料庫讀取是否存在進行限制不能解決問題)

 3.1.2 線程安全解決

  在需要同步的地方採用安全的類型。

  JDK鎖機制,lock、tryLock,synchronized,wait、notify、notifyAll等

  Concurrent併發工具包,在處理一些問題上,誰用誰知道。強烈建議查看源碼!

  數據表加鎖。(除非某個表的訪問頻率極低,否則不建議使用)

  涉及分散式的,採用中間件技術例如zookeeper等解決。

 3.2 非同步

  非同步使用場景不影響主線程,且響應較慢的業務。例如IO操作,第三方服務(簡訊驗證碼、app推送、雲存儲上傳等)。

  如果非同步任務很多,就需要使用任務隊列了,任務隊列可以在代碼級別實現,也可以利用redis(優勢太明顯了)。

 3.3 多線程通信

  這方面文章非常多,這裡不在詳述。

  1.共用變數方式(共用文件、全局變數,信號量機制等)

  2.消息隊列方式

  3. 忙等,鎖機制

 3.4多線程實現

  1.集成Thread類,重寫(這裡的重寫指的是override)run方法,調用start方法執行。

  2.實現Runable介面,實現run方法,以Runable實例創建thread對象。

  3.實現Callable介面,實現call方法,FutureTask包裝callable介面,FutureTask對象創建thread對象,常用語非同步操作,建議使用匿名內部類,方便閱讀和使用。

  額外需要說明的是:

  1.理解thread的join方法;

  2.不要認為volitate是線程安全的(不明白原因的建議去看jvm運行時刻記憶體分配策略);

  3.sleep時間片結束後並不保證立馬獲取cpu。

  4.ThreadLocal能夠為每一個線程維護變數副本,常用於在多線程中用空間換時間。

4. 開源框架

4.1 Hibernate、Mybatis

  相信每一個java程式員對這些都不陌生,這裡不再詳述。

  需要說明的主要以下幾點:

  1.hibernate一級緩存(內置session緩存),二級緩存(可裝配sessionFactory緩存),二級緩存會引起併發問題。

  2.hibernate延遲載入原理理解。

  3.hibernate 的get、load方法,sava、persist、savaOrUpdate方法區別

  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註解驅動的切麵。(強烈推薦:可讀性好,易維護,易擴展,開發快)

  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--支持當前事務,如果當前沒有事務,就以非事務方式執行。

  3. PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。

  4. PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。

  5. PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

  6. PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。

  事務隔離級別:

   1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別.另外四個與JDBC的隔離級別相對應

  2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,充許令外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重覆讀和幻像讀。

  3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據

  4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀,不可重覆讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下麵的情況產生(不可重覆讀)。

  5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重覆讀外,還避免了幻像讀。

4.5 其他Spring 技術棧

  spring boot 輕量級啟動框架

  spring security 用戶許可權管理,根據角色和用戶,實現UserDetailsService,進行自定義許可權管理。

  spring task 代碼級定時任務,註解方式,使用起來非常方便。需要註意的是,如果某次定時任務出了異常而沒有進行處理,會導致接下來定時任務失效。如果各個任務相互獨立,可以簡單用try,catch包圍(之前就吃過這方面的虧)。

  spring data 註解方式定義實體,屬性等

  spring mvc 簡單明瞭的mvc框架。url傳值、數組傳值、對象傳值、對象數組等傳值類型,上傳/下載文件類型需要註意。

  spring restful 註意命名,對命名要求很嚴格。

  spring shell 命令行方式執行命令,救火、導入導出數據等用起來非常方便、製作報表。  

5. 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業務處理類。

  Interceptor 攔截器,可以實現HandlerInterceptor介面自定義攔截器,在日誌記錄、許可權檢查、性能監控、通用行為等場景使用,本質是AOP。

  Listener 監聽器 常用於統計線上人數等縱向功能。

  Filter 過濾器 在請求介面處理業務之前改變requset,在業務處理之後響應用戶之前改變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文件中<exclusion> 包圍起來

  5.3.3 版本控制

  1.git、svn等

  2.代碼衝突解決方案

  3.分支管理。

  對於某個穩定版本上線後,如果在此基礎上開發新功能,一定要新建分支,在新分支上提交代碼,最後在新版發佈時合併分支。修改運營環境bug切換到主分支進行修改

5.4 Http請求

  5.4.1 請求方法

  post、get、put、head、delete、copy、move、connect、link、patch,最常用的是前4、5個。

  5.4.2 請求頭,狀態碼

  常用的請求頭有Accept(下載文件會特殊使用)、Accept-Charset(設置utf-8字元集)、Content-Type(json等配置)等

  常用的響應頭有Content-Type、Content-Type、Content-Length等,偏前端,不再詳述。

6. 系統架構

  接觸的不是特別多,目前用到的只是伺服器主從備份。Nginx反向代理進行配置。

  多個項目nginx配置

  Spring Mvc 用json數據進行交互,配置json轉換的servlet。

  封裝返回值

  自定義RunEnvironmentException(狀態碼,原因),覆蓋原有Exception,切麵ExceptionHandler抓取Exception並封裝到返回值中(前後端松耦合)

   令人頭疼的用戶重覆(連續快速點擊)提交問題,前端限制治標不治本;後端用sessonid在切麵上實現,又需要前端存儲,對所有請求數據加sessionId。最後用jedis中存儲,用介面名+用戶名當做key,根據不同的介面對不同的key可以單獨設置時間,不僅保證了重覆提交問題,也避免了惡意請求問題,同時還能自定義請求間隔。(期初擔心redis緩存讀寫時間延誤導致限制失效,後來發現多慮了,對一般的小系統來說,經性能測試,發現即使請求頻率再提高100被也不會導致限制失效)

  testNg單元測試、性能測試,覆蓋測試。

  切麵管理日期、許可權。緩存等。

7. Nosql

  1.Redis的java庫Jedis。

  Jedispool配置。

  項目中用到的有任務隊列、緩存。

   2. neo4j圖資料庫

  處理社交、推薦

8. 服務端

  linux操作系統熟悉以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啟動後一直訪問不了,查找一下午查不到原因,最後發現是防火牆問題)

  監控伺服器狀態(cpu,磁碟,記憶體),定位pid,日誌查看

  nginx負載均衡、反向代理、配置

  自動化部署腳本

  簡單shell腳本書寫,避免大量人力勞動。

  監控系統,代碼拋fatal異常自動發郵件,系統指標持續偏高自動發郵件。

  

9. 資料庫相關

  

10. 第三方介面對接

10.1 支付介面

  微信支付坑比較多,用將近兩周時間才把微信支付所有完成。需要在微信後臺配置的地方太多。

  而支付寶支付模塊只用了2天時間就搞定了。

10.2 推送介面

  為用戶定義tag、定義alias,註意當數據更新時需要同步更新tag、更新alias。如果沒採用非同步實現(用戶體驗就是好卡啊)

10.3 雲存儲

  大量文件上傳雲端(七牛雲),註意創建bucket

10.4 簡訊驗證

  很簡單的第三方介面,引入依賴,直接調用即可。需要在第三方後臺設置模板等,註意限定用戶訪問次數。

10.5 郵件

  很簡單小功能,工具類。

時間有限,目前先寫這麼多技術棧。對於代碼書寫和、演算法技巧問題,會抽時間寫在(2)中。

Java學習交流QQ群:589809992  禁止閑聊,非喜勿進!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.主要是使用控制項綁定點擊事件 用到的控制項分別為picturebox lable 上一頁pbPage_Prev 下一頁 pbPage_Next 首頁 pbPage_Begin 尾頁pbPage_End 是picturebox控制項加背景圖 “第 頁/ 共 頁” 是一個lable “labPageInf ...
  • 最近新升級了Visual Studio 2017,創建的Web項目Bin目錄中多了一個叫roslyn的文件夾,該文件夾導致網站在某些伺服器上發佈出錯 從網上搜索了一下,Roslyn是新出的動態編譯工具 但是在伺服器上安裝.net4.6後仍然提示編譯出錯。 解決方法:打開解決方案NuGet包管理器,卸 ...
  • 這個我是在winform的頁面上做的 1. 首先是在頁面上添加3個lable 第一次點擊lable會有相應的數據被查詢出來 第二次點擊同一個lable會刷新所有的數據 2.點擊不同的label會有顏色提示當前點擊的是哪一個 第二次點擊的時候會還原lable的顏色 3.根據本日 本周 本月查詢數據 是 ...
  • 1: 有兩個地方必須做異常處理,異常類型為IOException 伺服器讀客戶端發來的信息時: LeafTCPClient client = (LeafTCPClient)ar.AsyncState; try { if (client.NetWork.Connected) { NetworkStre ...
  • 在新的ASP.NET Core MVC中,視圖組件類似於局部視圖,但它們更強大。視圖組件不使用模型綁定,僅依賴於您在調用時提供的數據。 ...
  • 1.字元流 1.1 所有文件的存儲都是位元組的存儲,我們日常在磁碟上保存的其實並不是文件的字元,而是先把字元轉換成位元組,再把這些位元組儲存到磁碟。在讀取文件時,也是一個位元組一個位元組的讀取,然後生成位元組的序列。 1.2 位元組流可以處理任何對象,但是字元流呢,、只用來處理字元或者字元串。可以這樣說,位元組流呢 ...
  • 一共需要創建三個類: 1:Student類 存放程式所需的屬性和方法 2:Control類 具體的實現方法 3:Test類 測試類 Student類 Control類 Test類 ...
  • 此項目利用 TP+Redis+Nginx+nginx-rtmp-module+ffmpeg+HLS +Swoole 的架構方案 GitHub 地址:https://github.com/DOUBLE-Baller/momo QQ群:274904994 演示地址:http://51zhibo.top ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...