5.28 学习记录
安恒實習記錄
公司項目學習
HandlerMethodArgumentResolver的使用
當我們需要在controller頻繁的從session中獲取數據,比如從session中獲取user對象,之前常用的做法是從Request中取,這樣會使得在代碼中出現大量重復的代碼,顯得很臃腫。 因此選用其他的方法
- HandlerMethodArgumentResolver自定義解析器 實現請求數據綁定方法入參,只需要在參數中使用自定義的注解即可。
原理
首先,我們需要知道一點的就是SpringMVC的工作流程,SpringMVC的DispatchServlet會根據請求來找到對應的HandlerMapping,最終Spring會選擇用RequestMappingHandlerMapping,然后根據RequestMappingHandlerMapping來獲取HandlerMethod,然后來找支持的HandlerMethodArgumentResolver來處理對應controller的方法的入參.
項目中的實現
繼承HandlerMehtodArgumentResolver,重寫supportParameter和resolveArument方法。 其中supportParameter的入參是MethodParameter類型的類,下面來聊聊這個類。 首先它是spring核心中的一個類,并不是通過反射實現的,包含了方法對象、參數類型、方法名等屬性。具體構造方法和私有方法的介紹請參考:www.cnblogs.com/guangshan/p… 在項目中用到的是它的getParameterType方法和isAssignableFrom()方法,入參是我們要入參的對象類,如Account.class。還調用了hasParameterAnnotation()方法,從字面可以理解,作用是判斷是否有指定注解,入參是注解類,如InjectAccount.class,兩者返回的類型都是boolean,即只有當兩者都為true時,源對象和注解與我們需要的相同,返回true,可以執行resolveArgument方法。 resolveArgument方法比較簡單,即從request中取出指定的對象頭并返回。
X平臺中JSON的序列化與反序列化
簡介
X平臺是公司的一個數據平臺,通過http進行遠程訪問,因此設計到數據的序列化與反序列化。 涉及的方法只要有getXpfToken()這個比較簡單,獲得token進行一個身份驗證。getJsonString()從X平臺獲得數據,postJson()發送數據給X平臺。使用alibaba的fastjson處理json。
實現分析
- getXpfToken() X平臺的url、用戶名、密碼已經在配置中設置好,創建一個JSONObject對象,將屬性配置設置進去,利用Http遠程訪問獲得token。
- postJson() 入參的是String url,Map<String, Object> urlparams,Object類對象。如果參數不為空,則要先調用方法組裝帶參數的url。創建一個HttpPost對象,入參為帶參數的url。使用addHeader方法添加頭信息,"Content-type"。如果Object類對象不為空,則將Object序列化:
然后利用StringEntity的構造方法,將body入參,創建StringEntity對象(一種消息體形式,具體概念見https://blog.csdn.net/songmaolin_csdn/article/details/52776920)。設置進post對象,然后作為參數傳入doexcute()方法。
doexcute()
核心就是通過傳入的request和handler使用apache.http.client包中的execute()方法,遠程訪問X平臺得到數據并返回。首先創建一個信任所有SSL證書的客戶端對象,然后執行execute(),返回得到結果。
拓展學習
AQS框架的原理和實現
見讀書報告
每日一題
題目
全排列II 給定一個可包含重復數字的序列,返回所有不重復的全排列。
示例:
輸入: [1,1,2] 輸出: [ [1,1,2], [1,2,1], [2,1,1] ]
思路
本質還是使用回溯法進行全排列,區別是有重復的數字。使用一個大小與輸入數組相同的數組來記錄數字被使用的狀態。1表示已使用,0表示未使用,在每次遞歸結束后對狀態進行還原。在進行遍歷時如果當前數字的狀態是已使用或(下標大于0且當前下標對應值與前一位的值相同,前一位的狀態是未使用) 則continue,這一步的目的是去重。
代碼
class Solution {public List<List<Integer>> permuteUnique(int[] nums) {if(nums.length == 0) return new ArrayList<>();Arrays.sort(nums);List<List<Integer>> lists = new ArrayList<>();int[] visited = new int[nums.length];util( visited,nums, lists, new ArrayList<>());return lists;}public static void util(int[] visited, int[] nums, List<List<Integer>> lists, List<Integer> list ) {if (list.size() == nums.length) {lists.add(new ArrayList<>(list));return;}for (int i = 0; i < nums.length; i ++) {if(visited[i] == 1 || (i > 0 && visited[i - 1] == 0 && nums[i] == nums[i - 1])) continue;visited[i] = 1;list.add(nums[i]);util(visited, nums, lists, list);list.remove(list.size() -1);visited[i] = 0;}} } 復制代碼轉載于:https://juejin.im/post/5cec90f05188252dbd1b61be
總結
- 上一篇: 判断Oracle中某个字段是否含有数字
- 下一篇: 如何写优雅的SQL原生语句?