armonyOS 2提供了两种应用开发语言:Java和JS。Java线程特性能够让多任务并行,充分利用硬件资源开发出高性能的应用。而JS却是一个单线程语言,无法像Java一样创建新的Thread,用JS语言开发是否会导致硬件资源无法充分利用的情况呢?
本文给大家介绍“ACE JS的单线程异步机制”就是解决这个问题的。然而,说到 “单线程”与“异步”,大家可能会比较疑惑,因为单线程和异步在概念上是冲突的,单线程无法做到多任务并发,也就不会存在异步这种通信机制。
确实,JS语言本身是无法实现异步的,但是ACE JS框架却提供了多线程的宿主环境,通过消息通信机制让JS语言有了异步的属性,下面我们来详细描述其原理。
使用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
适配层主要完成对平台层进行抽象,提供抽象接口,可以对接到系统平台。比如:事件对接、渲染管线对接和系统生命周期对接等。
每个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线程的关系,我们准备了一个实验性质的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线程的相互调用应该是通过某种消息机制完成的,而不是阻塞式的调用。
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线程中的函数调用会存在于栈(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强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同。
打开setting文件选择Plugins选项
分别是安装JetBrains插件,第三方插件,本地已下载的插件包。详情见关于settings的文章。
http://www.cnblogs.com/jajian/p/8108690.html
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。
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
注:微信不支持外链,如需打开请自行复制链接
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
*请认真填写需求信息,我们会在24小时内与您取得联系。