JavaShuo
欄目
標籤
精幹貨! Java 後端程序員 1 年工做經驗總結
時間 2019-11-20
標籤
乾貨
java
後端
程序員
經驗總結
欄目
Java
简体版
原文
原文鏈接
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
事務傳播
概念:某些操做須要保證原子性,若是中間出錯,須要事務回滾。若是某個事務回滾,那麼
調用該事務的方法中的事務的做出如何的動做,就是事務傳播。
短期內寫不清楚,
建議訪問問
網頁連接查看。
事務傳播屬性:
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
新手很怕配置文件,理解完這些有助於熟悉配置文件網頁連接
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
文件中
包圍起來
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、第三方接口對接
9.1
支付接口
微信支付坑比較多,用將近兩週時間才把微信支付全部完成。須要在微信後臺配置的地方太
多。
而支付寶支付模塊只用了
2
天時間就搞定了。
9.2
推送接口
爲用戶定義
tag
、
定義
alias
,
注意當數據更新時須要同步更新
tag
、
更新
alias
。
若是沒采用
異步實現(用戶體驗就是好卡啊)
9.3
雲存儲
大量文件上傳雲端(七牛雲),注意建立
bucket
9.4
短信驗證
很簡單的第三方接口,引入依賴,直接調用便可。須要在第三方後臺設置模板等,注意限定
用戶訪問次數。
9.5
郵件
很簡單小功能,工具類。
時間有限,目前先寫這麼多技術棧。
6/10
相關文章
1.
java後端程序員1年工做經驗總結
2.
Java後端程序員1年工做經驗總結
3.
Java後端程序員3年工做經驗總結(一)
4.
java後端程序員1年工作經驗總結
5.
Java後端程序員1年工做經驗和技術總結
6.
1 年工做經驗的 Java 程序員面試經歷
7.
6年java工做經驗總結
8.
程序員工做兩年的經驗
9.
實習兩年後,JAVA 程序員的經驗總結!
10.
一個7年工做經驗的程序員的總結
更多相關文章...
•
C# 程序結構
-
C#教程
•
W3C 程序
-
W3C 教程
•
算法總結-歸併排序
•
Java 8 Stream 教程
相關標籤/搜索
乾貨總結
經驗總結
總結經驗
工做總結
前端乾貨
尖端乾貨
2年經驗
觀後總結
教程乾貨
經典總結
職業生涯
快樂工作
Java
MyBatis教程
Hibernate教程
PHP教程
後端
java
教程
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
字節跳動21屆秋招運營兩輪面試經驗分享
2.
Java 3 年,25K 多嗎?
3.
mysql安裝部署
4.
web前端開發中父鏈和子鏈方式實現通信
5.
3.1.6 spark體系之分佈式計算-scala編程-scala中trait特性
6.
dataframe2
7.
ThinkFree在線
8.
在線畫圖
9.
devtools熱部署
10.
編譯和鏈接
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
java後端程序員1年工做經驗總結
2.
Java後端程序員1年工做經驗總結
3.
Java後端程序員3年工做經驗總結(一)
4.
java後端程序員1年工作經驗總結
5.
Java後端程序員1年工做經驗和技術總結
6.
1 年工做經驗的 Java 程序員面試經歷
7.
6年java工做經驗總結
8.
程序員工做兩年的經驗
9.
實習兩年後,JAVA 程序員的經驗總結!
10.
一個7年工做經驗的程序員的總結
>>更多相關文章<<