整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          單線程也能開發異步任務?ACE JS框架到底是如何做到的

          armonyOS 2提供了兩種應用開發語言:Java和JS。Java線程特性能夠讓多任務并行,充分利用硬件資源開發出高性能的應用。而JS卻是一個單線程語言,無法像Java一樣創建新的Thread,用JS語言開發是否會導致硬件資源無法充分利用的情況呢?

          本文給大家介紹“ACE JS的單線程異步機制”就是解決這個問題的。然而,說到 “單線程”與“異步”,大家可能會比較疑惑,因為單線程和異步在概念上是沖突的,單線程無法做到多任務并發,也就不會存在異步這種通信機制。

          確實,JS語言本身是無法實現異步的,但是ACE JS框架卻提供了多線程的宿主環境,通過消息通信機制讓JS語言有了異步的屬性,下面我們來詳細描述其原理。

          ACE開發框架

          使用JS開發HarmonyOS應用,使用的開發框架名為ACE(Ability Cross-Platform Environment),該框架適用于手機、平板、智慧屏、智慧表、車機等設備,具備“一次開發,多端部署”的能力。

          ACE框架包括應用層(Application)、前端框架層(Framework)、引擎層(Engine)和平臺適配層(Porting Layer),如下圖所示:

          ?● Application

          應用層表示開發者使用JS UI框架開發的FA應用,這里的FA應用特指JS FA應用。

          ● Framework

          前端框架層主要完成前端頁面解析,以及提供MVVM(Model-View-ViewModel)開發模式、頁面路由機制和自定義組件等能力。

          ● Engine

          引擎層主要提供動畫解析、DOM(Document Object Model)樹構建、布局計算、渲染命令構建與繪制、事件管理等能力。

          ● Porting Layer

          適配層主要完成對平臺層進行抽象,提供抽象接口,可以對接到系統平臺。比如:事件對接、渲染管線對接和系統生命周期對接等。

          ACE開發框架的線程模型

          ?

          ?

          每個HarmonyOS JS應用,都是通過上圖所示的ACE開發框架進行加載渲染的。ACE開發框架包含了JS線程、UI線程、GPU線程、IO線程,并且在ACE框架外還會存在一類后臺任務線程。

          其中GPU線程與IO線程主要是ACE框架初始化與頁面加載渲染的過程需要的,為ACE框架內部的專有線程,不會被應用直接操作到,應用不需要特別關注;UI線程、JS線程和后臺任務線程會與應用開發代碼相關,后面著重分析這三個線程的作用和關系。

          ● UI線程:負責應用界面的繪制刷新,與應用的進程號相同,又叫主線程。如果開發JS+JAVA的混合編程,JAVA PA(Particle Ability)的onStart/onConnect等Ability生命周期回調便是運行在主線程,若在這些生命周期回調上執行耗時操作則會導致JS UI的繪制刷新卡住。

          ● JS線程:應用的JS代碼會被JS引擎解析執行,并運行在JS線程上,而JS又是單線程語言,所以目前我們工程中看到的所有的JS代碼都會執行在這個進程下唯一的JS線程上。

          ● 后臺任務線程:這里是對ACE框架外部的后臺線程的一個統稱,并不單指一個線程,也并不唯一。后臺任務線程包含了Java PA線程、文件操作API、網絡訪問API內部實現等相關線程。

          下面我們結合測試代碼來看一下這3個線程之間的關系。

          JS線程與UI線程的關系

          為了驗證JS線程與UI線程的關系,我們準備了一個實驗性質的Demo,主要代碼以及運行過程的Log如下:

          首先我們在IDE建立一個Empty Ablity(JS)模板的HelloWorld工程,在生命周期、按鈕響應回調方法里增加Log以觀察線程情況。剛創建的app.js中Application生命周期默認已經有Log,無需額外添加。

          我們只需要在主界面index.js文件中onInit增加日志:

          console.info(<span class="hljs-string">'page.default onInit'</span>);復制

          然后在index.hml中增加一個button以及會一直進行動畫的progress組件:

          
          <button id='button1' onclick="onButtonClick">I'm a button</button>
          <progress type="circular"/>復制

          最后在index.js中增加按鈕點擊響應事件以及Log,并且嘗試sleep阻塞js線程:

          
          function sleep(delay) {
                  for (var t = Date.now(); Date.now() - t <= delay; );
          }
          onButtonClick() {
                  console.info('onButtonClick begin');
                  sleep(1000);
                  console.info('onButtonClick end');
          }復制

          將應用運行起來,點擊兩次按鈕,得到如下Log:

          ?

          ?

          從輸出的Log中,我們可以看到這個JS FA進程號為22592,也就是說UI線程是22592;生命周期回調以及按鈕響應均在24077線程,這個就是JS線程,所以JS線程與UI線程不是同一個線程。

          并且我們嘗試通過sleep方法阻塞JS線程,想觀察JS線程阻塞是否會影響到UI線程的刷新。最終得出的結論是無論JS線程sleep多長時間,UI界面上的progress組件動畫一直會不斷刷新,按鈕也會有按壓效果變化,所以我們可以推測JS線程與UI線程的相互調用應該是通過某種消息機制完成的,而不是阻塞式的調用。

          JS線程與后臺任務線程的關系

          ACE JS框架提供了JS FA(Feature Ability)調用Java PA(Particle Ability)的機制,該機制提供了一種通道來傳遞方法調用、處理數據返回以及訂閱事件上報。我們同樣制作一個Demo來驗證JS線程與Java PA線程的關系:

          在JS中,我們通過FeatureAbility.callAbility拉起并調用了名為一個類名為ServiceAbility的Java PA,并拿到返回結果:

          var action = {};
          action.bundleName = <span class="hljs-string">'com.blancwu.test'</span>;
          action.abilityName = <span class="hljs-string">'com.blancwu.test.ServiceAbility'</span>;
          action.messageCode = <span class="hljs-number">1001</span>;
          action.abilityType = <span class="hljs-number">0</span>;
          action.syncOption = <span class="hljs-number">0</span>;
          
          console.info(<span class="hljs-string">'FeatureAbility.callAbility begin'</span> + JSON.stringify(action));
          FeatureAbility.callAbility(action).then(function (value) {
              console.info(<span class="hljs-string">'FeatureAbility.callAbility async result '</span> + JSON.stringify(value));
          })
          console.info(<span class="hljs-string">'FeatureAbility.callAbility end'</span> + JSON.stringify(action));復制

          在ServiceAbility的onRemoteRequest中增加Log輸出,并sleep 1秒鐘,以便觀察線程情況與之間關系:

          
          @Override
          public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) throws RemoteException {
              HiLog.info(LABEL_LOG, "onRemoteRequest begin " + code);
              if (code == 1001) {
                  try {
                      Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  Map<String, Object> result = new HashMap<String, Object>();
                  result.put("result", 1);
                  reply.writeString(ZSONObject.toZSONString(result));
              }
              HiLog.info(LABEL_LOG, "onRemoteRequest end " + code);
              return super.onRemoteRequest(code, data, reply, option);
          }復制

          以上代碼完成后,我們進行執行,得到的Log如下:

          ?

          ?

          我們觀察到本次運行主進程(UI線程)號為4133,JS代碼執行在JS線程5887,Java PA響應onRemoteRequest執行在另一個后臺任務線程5837。通過Log我們看到onRemoteRequst即使阻塞了后臺任務線程1s也不會影響JS線程的并行執行以及主線程(UI線程)上動畫的刷新,做到了JS線程與后臺任務線程異步地執行事務。

          JS線程的異步機制

          上面從代碼實驗角度觀察到了JS線程與其他線程的異步關系,那么JS線程是怎么處理來自其他多個線程的調用的呢?我們先來看一下傳統的瀏覽器環境下的機制:

          ?

          ?

          上圖中,JS線程中的函數調用會存在于棧(stack)中,棧中的函數可以調用瀏覽器環境提供的WebAPIs,包含了DOM、ajax、timeout等API,這些API會在瀏覽器環境提供的另外一個外部線程執行,執行完成后會在任務隊列(callback queue)中加入對應的回調事件(如onClick、onLoad、onDone)。當棧中的代碼執行完畢,即棧清空后,JS線程又會通過event loop取出任務隊列中的下一個任務進行執行,以此類推完成整個的程序執行。更具體的機制可以去看阮一峰老師介紹JS EventLoop的文章:

          ● JS EventLoop介紹

          http://www.ruanyifeng.com/blog/2014/10/event-loop.html

          HarmonyOS ACE開發框架同樣遵循上述最基本的EventLoop調度機制,并且提供了更多的機制和API,讓業務邏輯可以在外部線程執行,包含了上面提到的Java PA以及異步回調的系統能力API。其中,異步回調的系統能力API包含如文件系統操作和網絡操作等,具體大家可以按照我們實驗Demo的方法去嘗試一下。

          ● 參考

          https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-file-storage-0000000000629445

          未來發展的展望

          目前ACE JS應用內實現多線程的最佳方式是通過混合編程調用Java PA方式,但未來純JS應用一定會越來越多,那么,只支持單線程的JS ACE框架的異步API能解決各種復雜場景的問題嗎?

          單線程的JS加上異步API能夠很好解決單個I/O阻塞的問題,但是如果遇到大量的I/O事件,比如批刪除大量文件,通過for循環發起了大量異步任務,也會降低執行效率,甚至阻塞其他異步任務的執行。并且如果要使用JS語言開發計算密集型的任務,也無法在唯一的JS線程上進行。

          這時就需要一個真正的JS多線程處理機制了,雖然目前HarmonyOS 2還未支持,但未來HarmonyOS會考慮規劃出與HTML5類似提供支持WebWorker機制,支持開發出多線程的JS代碼,提供給應用開發者更多的發揮空間。

          帖子(轉載)描述了一些C/C++中的開源庫,供平時工作中參考。

          如果各位小伙伴有用的方便且好用的庫也請分享上來吧!

          1 綜合性的庫

          Boost

          Home:http://boost.org/

          Boost 大概是最重要的第三方 C++ 庫。其作者有很多是 C++ 標準委員會的成員。Boost 的很多子庫后來都成為 C++ 的標準庫。

          本頁面的其它章節還會繼續提及 Boost 在各種領域的應用。

          wxWidgets

          Home:https://wxwidgets.org/

          這是一個非常老牌的 C++ 開源 GUI 框架,誕生于1992年。原先叫做 wxWindows,后來因為微軟的法律糾紛,改為現名。

          它支持的操作系統平臺很多(包括嵌入式系統)。

          很多開源項目用到它,比如:BitTorrent、aMule、FileZilla、Code::Blocks、Dolphin......

          雖然它以 GUI 為主,但是也提供了其它一些輔助功能(比如:進程間通訊、網絡、數據庫、多媒體......)

          Qt

          Home:http://www.qt-project.org/

          這是一個非常老牌的 C++ 開源 GUI 框架,于1995年發布 1.0 版本。原先由 Trolltech 公司維護,后來該公司被 Nokia 收購。

          它支持的操作系統平臺很多(包括嵌入式系統)。

          雖然它以 GUI 為主,但是也提供了其它一些輔助功能(比如:網絡、數據庫、多媒體、3D引擎......)

          APR(Apache Portable Runtime)

          Home:https://apr.apache.org/

          這是由 Apache 社區維護的 C 開源庫,主要提供操作系統相關的功能(文件系統、進程、線程、用戶、IPC)。此外還提供了一些網絡相關的功能。

          APR 原先是 Apache Web 服務器的一個組成部分,后來獨立出來,成為一個單獨的開源項目。

          ACE(Adaptive Communication Environment)

          Home:http://www.cse.wustl.edu/~schmidt/ACE.html

          這是一個跨平臺的 C++ 庫,提供了一套網絡通訊的框架;另外還支持線程、進程和 IPC。

          POCO

          Home:http://pocoproject.org/

          它的名稱源自“POrtable COmponents”,是一個基于 C++ 的開源庫。

          它的功能以網絡通訊為主,同時也提供一些其它功能(比如:多線程、進程間通訊、數據庫、XML、JSON......)

          Dlib

          Home:http://dlib.net/

          誕生于2002年的 C++ 開源庫,提供了非常多的功能(網絡、多線程、GUI、數值計算、圖像處理、數據挖掘......)。

          它還有一個特色是:同時提供了 Python API :)

          Crypto++

          Home:http://www.cryptopp.com/

          它也叫“CryptoPP”或“libcrypto++”,是非常著名的開源加密庫,誕生于1995年。基于 C++ 開發,大量用到模板語法。

          雖然它以加密為主,但是也提供了其它一些輔助功能(比如:數據壓縮、編碼解碼、計時器...)


          2 數據結構 & 算法

          2.1 容器

          2.1.1 標準容器

          std

          C++ 98 標準內置的 STL 提供了如下容器:

          數組:vector(動態數組)、valarray(針對數值類型特化的 vector)、bitset(儲存比特的【固定】數組)

          鏈表:list(雙向)

          隊列:queue、deque(雙端隊列)

          棧:stack

          映射:map(鍵值無重復)、multimap(鍵值可重復)

          集合:set(元素無重復)、multiset(元素可重復)

          C++ 11 標準新增了如下容器:

          數組:array(相比 vector,它的 size 是編譯時【固定】的)

          鏈表:forward_list(相比 list,它是【單向】的)

          映射:unordered_map、unordered_multimap(相比 map 和 multimap,這倆采用 hash 實現)

          集合:unordered_set、unordered_multiset(相比 set 和 multiset,這倆采用 hash 實現)

          下面幾個容器,C++ 標準【沒有】包含,但包含在某些知名的 STL 第三方庫中(比如 SGI 的 STL):

          映射:hash_map、hash_multimap(與 unordered_map、unordered_multimap 相同)

          集合:hash_set、hash_multiset(與 unordered_set、unordered_multiset 相同)

          2.1.2 Lockfree 的容器

          Boost.Lockfree

          Docs:http://boost.org/libs/lockfree

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了三種 lock-free 的容器(queue、stack、spsc_queue)。最后這種是“環形緩沖”。

          libcds(Concurrent Data Structures)

          Home:http://libcds.sourceforge.net/

          這是一個跨平臺的 C++ 開源庫,提供了若干 lock-free 的容器。它的 2.0.0 版本,代碼重寫以支持 C++ 11 標準。

          2.1.3 環形緩沖

          Boost.CircularBuffer

          Docs:http://boost.org/libs/circular_buffer

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了“環形緩沖區”的模板。

          “環形緩沖區”可以降低內存分配的開銷。

          代碼示例



          2.1.4 多維數組

          Boost.MultiArray

          Docs:http://boost.org/libs/multi_array

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了任意維的數組。

          代碼示例——3維數組



          2.1.5 圖

          Boost.Graph

          Docs:http://boost.org/libs/graph

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,簡稱 BGL(Boost Graph Library),封裝了“圖”這種數據結構。

          它提供了與 STL 類似的泛型編程風格。

          Dlib

          Docs:http://dlib.net/graph_tools.html

          Dlib 前面已經介紹過。它提供了2個類(graph & directed_graph)封裝“圖”。

          2.2 對容器的操作

          (STL 標準庫里面已經實現了很多算法用來操作容器,考慮到本頁面已經很長,這里只列舉第三方庫實現的算法)

          Boost.Foreach

          Docs:http://boost.org/libs/foreach

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了通用的遍歷,其效果類似于 Python 的 for 循環語法。

          有了它,你在遍歷時無需聲明迭代器變量,也無需關心遍歷的容器是何種類型。

          代碼示例——遍歷字符串



          2.3 字符串處理

          2.3.1 字符集

          Boost.Locale

          Docs:http://boost.org/libs/locale

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了各種“本地化”的功能。其中就包括字符集編碼轉換。

          代碼示例



          POCO.Text

          Docs:http://pocoproject.org/docs/package-Foundation.Text.html

          POCO 前面已經介紹過。它提供了 UTF8/UTF16/UTF32 的轉換。

          2.3.2 字符串格式化

          Boost.Format

          Docs:http://boost.org/libs/format

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了“格式化字符串”的功能。相比 ANSI C 的 sprintf() 和 snprintf(),它的格式化功能更強并且更安全。

          代碼示例



          fmt

          Home:https://github.com/fmtlib/fmt

          這是一個輕量級、類型安全、高性能的字符串格式化庫。它也可以用來替代 C++ 標準庫中的 IOStreams。

          代碼示例



          2.3.3 正則表達式

          PCRE(Perl Compatible Regular Expressions)

          Home:http://www.pcre.org/

          這是一個很老牌的正則表達式的庫,誕生于1997年。很多知名的開源項目(Apache、PHP、KDE)用到了它。

          Boost.Regex

          Docs:http://boost.org/libs/regex

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了“正則式”的功能。

          注:Boost 的這個子庫已經進入 C++ 11 標準。

          代碼示例——基于正則式進行匹配和替換



          re2

          Home:https://github.com/google/re2

          這是 Google 提供的正則式庫,基于 C++。其 API 使用起來很簡潔。

          有多種腳本語言(Python、Ruby、Perl、Node.js、Erlang、OCaml)提供了對它的封裝。

          代碼示例——基于正則式進行匹配



          Oniguruma(鬼車)

          Home:http://www.geocities.jp/kosako3/oniguruma/

          來自日本的正則式庫,基于 C 語言。據說性能很高。

          它被用在 Ruby、TextMate、Sublime Text、SubEthaEdit 等軟件上。

          POCO.RegExp

          Docs:http://pocoproject.org/docs/package-Foundation.RegExp.html

          POCO 前面已經介紹過。它提供了正則表達式的封裝類。

          Qt.QRegExp

          Docs:http://doc.qt.io/qt-4.8/qregexp.html

          Qt 前面已經介紹過。這是 Qt 中的一個類,提供了“正則式”的功能。

          2.3.4 (其它)

          Boost.StringAlgorithms

          Docs:http://boost.org/libs/algorithm/string

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了各種字符串的算法(替換、合并、拆分、大小寫轉換、trim......)。

          代碼示例——字符串合并



          Boost.Lexical_Cast

          Docs:http://boost.org/libs/lexical_cast

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了各種字符串與其它類型的轉換。

          注:Boost 的這個子庫已經進入 C++ 11 標準。

          代碼示例



          2.4 內存相關

          2.4.1 智能指針

          Boost.SmartPointers

          Docs:http://boost.org/libs/smart_ptr

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了幾種智能指針。最常用的是“shared_ptr”。

          有了智能指針,你就無需操心 new 之后的 delete 了。

          注:Boost 的這個子庫已經進入 C++ 11 標準。

          2.4.2 內存池

          Boost.Pool

          Docs:http://boost.org/libs/pool

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了“內存池”的功能。

          Dlib

          Docs:http://dlib.net/other.html

          Dlib 前面已經介紹過。它提供了內存池(參見文檔中以“memory_manager”開頭的類)。

          APR

          Docs:https://apr.apache.org/docs/apr/trunk/modules.html

          APR 前面已經介紹過。它提供了內存池的功能。

          2.5 時間 & 日期

          Boost.Date_Time

          Docs:http://boost.org/libs/date_time

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了針對“日期 和 時間”的各種處理。

          POCO.DateTime

          Docs:http://pocoproject.org/docs/package-Foundation.DateTime.html

          POCO 前面已經介紹過。它提供了若干個日期和時間的封裝類(時區轉換、格式化字符串、解析時間字符串)。

          2.6 編碼 & 解碼

          2.6.1 序列化

          Boost.Serialization

          Docs:http://boost.org/libs/serialization

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了【可定制的】“序列化”功能。

          2.6.2 Base64

          Base64 是一組編碼算法的總稱。用于把二進制數據編碼為文本。

          Boost.Serialization

          Docs:http://boost.org/libs/serialization

          Boost 前面已經介紹過。使用前面提到的“Boost.Serialization”,你可以定制采用 Base64 方式進行編碼和解碼。

          Crypto++

          Docs:http://www.cryptopp.com/docs/ref/annotated.html

          Crypto++ 前面已經介紹過。它提供了6個類,分別用于 Base64、Base32、Base16 的編碼/解碼。

          POCO.Streams

          Docs:http://pocoproject.org/docs/package-Foundation.Streams.html

          POCO 前面已經介紹過。它提供了 Base64 和 Base32 的編碼/解碼。

          2.7 (其它)

          2.7.1 隨機數

          std

          ANSI C 在 stdlib.h 中提供了隨機數生成函數 rand()。使用前記得先用 srand() 函數播種,否則就傻了。

          Boost.Random

          Docs:http://boost.org/libs/random

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了“隨機數生成”的功能。

          相比 ANSI C 的隨機數函數,它提供的功能更豐富。

          代碼示例



          Crypto++

          Docs:http://www.cryptopp.com/docs/ref/class_random_number_generator.html

          Crypto++ 前面已經介紹過。它提供了好幾個類,用于隨機數生成。

          2.7.2 UUID

          Boost.UUID

          Docs:http://boost.org/libs/uuid

          Boost 前面已經介紹過。這是 Boost 的其中一個子庫,提供了 UUID 的生成。

          代碼示例——生成 UUID



          APR

          Docs:https://apr.apache.org/docs/apr/trunk/modules.html

          APR 前面已經介紹過。它提供了 UUID 的生成、格式化成字符串、解析 UUID 字符串。

          POCO.UUID

          Docs:http://pocoproject.org/docs/package-Foundation.UUID.html

          POCO 前面已經介紹過。它提供了 UUID 的生成、格式轉換。

          天介紹一下IDEA的一些炫酷的插件,IDEA強大的插件庫,不僅能給我們帶來一些開發的便捷,還能體現我們的與眾不同。

          1.插件的安裝

          打開setting文件選擇Plugins選項

          • Ctrl + Alt + S
          • File -> Setting

          分別是安裝JetBrains插件,第三方插件,本地已下載的插件包。詳情見關于settings的文章。

          http://www.cnblogs.com/jajian/p/8108690.html

          2.各種插件

          1. activate-power-mode 和 Power mode II

          根據Atom的插件activate-power-mode的效果移植到IDEA上

          寫代碼是整個屏幕都在抖動,activate-power-mode是白的的,Power mode II色彩更酷炫點。

          2.Background Image Plus

          idea背景修改插件,讓你的idea與眾不同,可以設置自己喜歡的圖片作為code背景。

          安裝成功之后重啟,菜單欄的VIew標簽>點擊Set Background Image(沒安裝插件是沒有這個標簽的),在彈框中路由選擇到本地圖片,點擊OK即可。

          3.Grep console

          自定義日志顏色,idea控制臺可以彩色顯示各種級別的log,安裝完成后,在console中右鍵就能打開。

          并且可以設置不同的日志級別的顯示樣式。

          可以直接根據關鍵字搜索你想要的,搜索條件是支持正則表達式的。官網地址

          https://plugins.jetbrains.com/idea/plugin/7125-grep-console

          4.Free Mybatis plugin

          mybatis 插件,讓你的mybatis.xml像java代碼一樣編輯。我們開發中使用mybatis時時長需要通過mapper接口查找對應的xml中的sql語句,該插件方便了我們的操作。

          安裝完成重啟IDEA之后,我們會看到code左側或多出一列綠色的箭頭,點擊箭頭我們就可以直接定位到xml相應文件的位置。

          mapper

          xml

          5.MyBatis Log Plugin

          Mybatis現在是java中操作數據庫的首選,在開發的時候,我們都會把Mybatis的腳本直接輸出在console中,但是默認的情況下,輸出的腳本不是一個可以直接執行的。

          如果我們想直接執行,還需要在手動轉化一下。

          MyBatis Log Plugin 這款插件是直接將Mybatis執行的sql腳本顯示出來,無需處理,可以直接復制出來執行的,如圖:

          執行程序后,我們可以很清晰的看到我們執行了哪些sql腳本,而且腳本可以執行拿出來運行。

          6.String Manipulation

          強大的字符串轉換工具。使用快捷鍵,Alt+m。

          • 切換樣式(camelCase, hyphen-lowercase, HYPHEN-UPPERCASE, snake_case, SCREAMING_SNAKE_CASE, dot.case, words lowercase, Words Capitalized, PascalCase)
          • 轉換為SCREAMING_SNAKE_CASE (或轉換為camelCase)
          • 轉換為 snake_case (或轉換為camelCase)
          • 轉換為dot.case (或轉換為camelCase)
          • 轉換為hyphen-case (或轉換為camelCase)
          • 轉換為hyphen-case (或轉換為snake_case)
          • 轉換為camelCase (或轉換為Words)
          • 轉換為camelCase (或轉換為lowercase words)
          • 轉換為PascalCase (或轉換為camelCase)
          • 選定文本大寫
          • 樣式反轉

          7.Alibaba Java Coding Guidelines

          阿里巴巴代碼規范檢查插件,當然規范可以參考《阿里巴巴Java開發手冊》。

          8.Lombok

          Java語言,每次寫實體類的時候都需要寫一大堆的setter,getter,如果bean中的屬性一旦有修改、刪除或增加時,需要重新生成或刪除get/set等方法,給代碼維護增加負擔,這也是Java被詬病的一種原因。

          Lombok則為我們解決了這些問題,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@EqualsAndHashCode或@Data)之后,就不需要編寫或生成get/set等方法,很大程度上減少了代碼量,而且減少了代碼維護的負擔。

          安裝完成之后,在應用Lombok的時候注意別忘了需要添加依,maven為例:

          <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
          </dependency>
          @Setter
          @Getter
          @ToString
          @EqualsAndHashCode
          public class People {
           private String name;
           private int age;
           private String male;
          }
          

          9.Key promoter

          Key promoter 是IntelliJ IDEA的快捷鍵提示插件,會統計你鼠標點擊某個功能的次數,提示你應該用什么快捷鍵,幫助記憶快捷鍵,等熟悉了之后可以關閉掉這個插件。

          10.Gsonformat

          可根據json數據快速生成java實體類。

          自定義個javaBean(無任何內容,就一個空的類),復制你要解析的Json,然后alt+insert彈出如下界面或者使用快捷鍵 Alt+S,在里面粘貼剛剛復制的Json,點擊OK即可。

          11.Restfultookit

          Spring MVC網頁開發的時候,我們都是通過requestmapping的方式來定義頁面的URL地址的,為了找到這個地址我們一般都是cmd+shift+F的方式進行查找,大家都知道,我們URL的命名一個是類requestmapping+方法requestmapping,查找的時候還是有那么一點不方便的,restfultookit就能很方便的幫忙進行查找。

          例如:我要找到/user/add 對應的controller,那么只要Ctrl+斜杠 ,(圖片來自于網絡)

          就能直接定位到我們想要的controller。這個也是真心方便,當然restfultookit還為我們提供的其他的功能。根據我們的controller幫我們生成默認的測試數據,還能直接調用測試,這個可以是解決了我們每次postman調試數據時,自己傻傻的組裝數據的的操作,這個更加清晰,比在console找數據包要方便多了。(圖片來自于網絡)

          12.JRebel

          JRebel是一種熱部署生產力工具,修改代碼后不用重新啟動程序,所有的更改便可以生效。它跳過了Java開發中常見的重建、重新啟動和重新部署周期。

          使用方式參考此處:

          https://jingyan.baidu.com/article/ac6a9a5e31417c2b653eace8.html

          3.常用插件推薦

          注:微信不支持外鏈,如需打開請自行復制鏈接

          Gitee

          開源中國的碼云插件

          https://plugins.jetbrains.com/plugin/8383-gitee

          Alibaba Java Coding Guidelines

          阿里巴巴出的代碼規范檢查插件

          https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines

          IDE Features Trainer

          IntelliJ IDEA 官方出的學習輔助插件

          https://plugins.jetbrains.com/plugin/8554?pr=idea

          Key promoter

          快捷鍵提示

          https://plugins.jetbrains.com/plugin/4455?pr=idea

          Grep Console

          自定義設置控制臺輸出顏色

          https://plugins.jetbrains.com/idea/plugin/7125-grep-console

          String Manipulation

          駝峰式命名和下劃線命名交替變化

          https://plugins.jetbrains.com/plugin/2162?pr=idea

          CheckStyle-IDEA

          代碼規范檢查

          https://plugins.jetbrains.com/plugin/1065?pr=idea

          FindBugs-IDEA

          潛在 Bug 檢查

          https://plugins.jetbrains.com/plugin/3847?pr=idea

          MetricsReloaded

          代碼復雜度檢查

          https://plugins.jetbrains.com/plugin/93?pr=idea

          Statistic

          代碼統計

          https://plugins.jetbrains.com/plugin/4509?pr=idea

          JRebel Plugin

          熱部署

          https://plugins.jetbrains.com/plugin/?id=4441

          CodeGlance

          在編輯代碼最右側,顯示一塊代碼小地圖

          https://plugins.jetbrains.com/plugin/7275?pr=idea

          GsonFormat

          把 JSON 字符串直接實例化成類

          https://plugins.jetbrains.com/plugin/7654?pr=idea

          Markdown Navigator

          書寫 Markdown 文章

          https://plugins.jetbrains.com/plugin/7896?pr=idea

          Eclipse Code Formatter

          使用 Eclipse 的代碼格式化風格,在一個團隊中如果公司有規定格式化風格,這個可以使用。

          https://plugins.jetbrains.com/plugin/6546?pr=idea

          Jindent-Source Code Formatter

          自定義類、方法、doc、變量注釋模板

          http://plugins.jetbrains.com/plugin/2170?pr=idea

          Translation

          翻譯插件

          https://github.com/YiiGuxing/TranslationPlugin

          Maven Helper

          Maven 輔助插件

          https://plugins.jetbrains.com/plugin/7179-maven-helper

          Properties to YAML Converter

          把 Properties 的配置格式改為 YAML 格式

          https://plugins.jetbrains.com/plugin/8000-properties-to-yaml-converter

          Git Flow Integration

          Git Flow 的圖形界面操作

          https://plugins.jetbrains.com/plugin/7315-git-flow-integration

          Rainbow Brackets

          對各個對稱括號進行著色,方便查看

          https://github.com/izhangzhihao/intellij-rainbow-brackets

          MybatisX

          mybatis 框架輔助(免費)

          https://plugins.jetbrains.com/plugin/10119-mybatisx

          Lombok Plugin

          Lombok 功能輔助插件

          https://plugins.jetbrains.com/plugin/6317-lombok-plugin

          .ignore

          各類版本控制忽略文件生成工具

          https://plugins.jetbrains.com/plugin/7495--ignore

          mongo4idea

          mongo客戶端

          https://github.com/dboissier/mongo4idea

          iedis

          redis客戶端

          https://plugins.jetbrains.com/plugin/9228-iedis

          GenerateAllSetter

          new POJO類的快速生成 set 方法

          https://plugins.jetbrains.com/plugin/9360-generateallsetter


          主站蜘蛛池模板: 精品国产高清自在线一区二区三区| 国产精品一区二区电影| 无码精品人妻一区二区三区免费看| 在线观看日韩一区| 无码人妻精品一区二区三区99性 | 国产麻豆精品一区二区三区v视界 国产美女精品一区二区三区 | 午夜视频一区二区三区| 无码乱码av天堂一区二区| 亚洲福利一区二区三区| 国产精品福利一区二区久久| 亚洲高清美女一区二区三区| 亚洲午夜一区二区三区| 无码精品人妻一区二区三区人妻斩| 无码AV中文一区二区三区| 亚洲影视一区二区| 亚洲AV无码一区二区三区电影 | 在线播放精品一区二区啪视频| 无码少妇一区二区三区芒果| 蜜臀AV无码一区二区三区| 无码一区二区三区亚洲人妻| 国产伦精品一区二区三区在线观看| 精品久久久中文字幕一区 | 午夜DV内射一区区| 蜜桃视频一区二区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产一区二区三区无码免费| 国产一区二区三区免费观在线| 国产探花在线精品一区二区| 国产爆乳无码一区二区麻豆 | 日本精品少妇一区二区三区| 国产一区二区三区免费| 激情内射亚洲一区二区三区爱妻| 亚洲美女一区二区三区| 免费在线观看一区| 亚洲日本一区二区三区在线| 深田咏美AV一区二区三区| 国产日韩精品一区二区在线观看播放 | 亚洲A∨精品一区二区三区下载| 色系一区二区三区四区五区| 东京热人妻无码一区二区av| 国产成人精品一区二三区熟女|