整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

单线程也能开发异步任务?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