背景html
在實際開發中,數據的處理有五種:獲取、傳輸、存儲、分析、轉換。每種各對應一些經常使用的技術。
序列化和反序列化算法
序列化是將對象的信息轉換爲可傳輸或可存儲形式的過程。反序列化就是反過來讓這些可傳輸的、可存儲的信息變回對象。spring
傳輸的序列化除了安全性的考慮,由於涉及到和第三方通訊,因此還有重要的一點是可讀性和不變性。而存儲的鏈路短,可控,因此更講究效率。安全
傳輸最經常使用的序列化手段是JSON這樣人眼可讀的。而存儲會使用protostuff這種將key值映射成編碼來傳輸的。由於1,2,3比one、two、four更省空間更高效。可是傳輸中都用編碼,解析時就很難判斷它的意義。雙方還要進行額外的約定。原本3表明four,中間加了一個three,3表明three的話,對方沒有及時被通知,那麼解析傳輸過來的消息就是錯的。工具
反射
Java反射是在運行時,對於任何一個類,均可以知道這個類有哪些方法和屬性。對於任何一個對象,都能對它的方法和屬性進行調用。
經常使用數據轉換工具,好比Spring的RequestParam、RequestBody、ResponseBody內部就用了反射機制。還有Jackson等工具類。甚至在業務代碼中直接使用反射也是很常見的。好比設計一個AI助手問答機。想實現:大數據
小A:我要搜索美女"冰冰"AI助手:OK,搜索"冰冰"小A:想知道她的"年齡"AI助手:21歲
上面這個JAVA實現是這樣的:編碼
Field field = 美女.class.getDeclaredField(年齡);field.setAccessible(true);return field.get(冰冰).toString();
動態代理spa
代理模式是爲了提供加強的或不一樣的操做,而插入來替代實際對象的對象。這些操做涉及到與實際對象的通訊,因此稱爲代理。
Spring主要的兩大思想IoC和AOP。對於IoC,利用的是反射機制。而AOP使用了動態代理,固然底層也是反射。
JDK動態代理只能給有接口的類代理。本質是經過反射獲取要執行的方法,並在執行前或者後加入一些代理處理操做。cglib本質上用繼承的方法實現的,是經過動態生成一個子類去覆蓋所要代理的類。用final修飾的不能被覆蓋的就不代理了。spring動態代理是優先使用JDK動態代理,若是目標沒有實現任何接口,則建立一個cglib代理。若是幾個類實現了都實現了一個通用接口,好比Runnable,而且加了Component請spring來負責其生命週期。這時候會拋出一個Proxy代理異常。說指望加載一個Bean,實際上實現卻不僅一個。這時候能夠在這個類上加下面標籤強制使用cglib代理來解決。設計
@EnableAspectJAutoProxy(proxyTargetClass = true)
總結代理
我工做十幾年來,查找和排序算法一直被奉爲經典。而這兩項就是搜索技術的核心。大數據是創建在搜索技術基礎上的。AI又是創建在大數據基礎上的。可見查找和排序的核心地位。看似高深的技術也是從最底層開始。苦練基本功。
原文出處:https://www.cnblogs.com/xiexj/p/11580117.html