Java 开发者必备的 十 个 IntelliJ IDEA 插件
在Java编程中,IntelliJ IDEA作为首选IDE受到开发者们的源码插件青睐。为提升工作效率,源码插件分销源码怎么实现我们特别挑选了个不可或缺的源码插件插件,让繁琐任务变得轻松。源码插件以下是源码插件这些插件的详细介绍:
1. 彩虹括号(Rainbow Brackets):解决嵌套代码困扰,通过颜色编码匹配括号,源码插件让你在代码海洋中游刃有余。源码插件
2.
CodeSmart(Codota):智能提示让你只需输入首字母,源码插件即可看到完整语句,源码插件甚至显示使用频率,源码插件提升代码输入速度。源码插件
3.
Key Promoter X:助你快速掌握快捷键,如在使用StringBuilder时,只需“Ctrl+B”就能轻松跳转。
4.
Lombok:精简实体类编写,通过成员变量自动生成getter、setter和构造方法,减少代码冗余。
5.
CodeGlance:右侧缩略图显示,让长代码一目了然。
6.
Maven Helper:Maven项目管理助手,方便查看依赖冲突和依赖结构。
7.
JRebel:热部署神器,实时代码更新,避免繁琐的重建过程。
8.
驼峰命名和下划线转换:通过Shift + Alt + U快速转换变量命名风格,便于大量修改。
9.
Save Actions:自动格式化代码,优化包导入,添加修饰符等,提升代码质量。
.
Translation:项目注释翻译插件,帮助理解源码内容,提升阅读效率。
这些插件让Java开发者在IntelliJ IDEA中如虎添翼,趋势骑士ea源码提高了开发效率和代码管理。
常用 Maven 插件介绍(收藏大全)
Maven作为核心插件框架,其构建任务主要由众多插件执行,如maven-compiler-plugin负责编译源代码。插件通过目标(goal)来完成特定任务,如compile目标处理src/main/java的源码,testCompile处理src/test/java的测试源码。用户可以通过两种方式调用插件目标:与生命周期阶段绑定,如mvn compile,或直接指定目标,如mvn archetype:generate。
深入理解Maven机制后,掌握常用插件至关重要,以提高效率。Maven社区的插件生态丰富,官方提供了两个插件列表:org.apache.maven.plugins和org.codehaus.mojo。前者包含成熟插件,如maven-antrun-plugin执行Ant任务,maven-archetype-plugin生成项目骨架,maven-assembly-plugin制作项目分发包,maven-dependency-plugin分析项目依赖等。
例如,maven-antrun-plugin允许在项目中运行Ant任务,maven-archetype-plugin用于快速生成项目模板,maven-assembly-plugin则用于定制化打包。了解这些插件后,日常构建工作将更加顺利。
小结,本文重点介绍了常用的Maven插件,包括maven-antrun-plugin、maven-archetype-plugin、maven-assembly-plugin等,它们在项目构建中扮演着重要角色。了解它们能有效提高开发效率。若需更全面的插件列表,可参考Apache和Codehaus Mojo的列表,搜索工具如search.maven.org也有助于查找特定插件。
mybatis插件机制源码解析
引言
本篇源码解析基于MyBatis3.5.8版本。放红接口源码
首先需要说明的是,本篇文章不是mybatis插件开发的教程,而是从源码层面分析mybatis是如何支持用户自定义插件开发的。
mybatis的插件机制,让其扩展能力大大增加。比如我们项目中经常用到的PageHelper,这就是一款基于mybatis插件能力开发的产品,它的功能是让基于mybatis的数据库分页查询更容易使用。
当然基于插件我们还可以开发其它功能,比如在执行sql前打印日志、做权限控制等。
正文mybatis插件也叫mybatis拦截器,它支持从方法级别对mybatis进行拦截。整体架构图如下:
解释下几个相关概念:
Interceptor拦截器接口,用户自定义的拦截器就是实现该接口。
InterceptorChain拦截器链,其内部维护一个interceptorslist,表示拦截器链中所有的拦截器,并提供增加或获取拦截器链的方法。比如有个核心的方法是pluginAll。该方法用来生成代理对象。
Invocation拦截器执行时的上下文环境,其实就是目标方法的调用信息,包含目标对象、调用的方法信息、参数信息。核心方法是proceed。该方法的主要目的就是进行处理链的传播,执行完拦截器的方法后,最终需要调用目标方法的invoke方法。
mybatis支持在哪些地方进行拦截呢?你只需要在代码里搜索interceptorChain.pluginAll的使用位置就可以获取答案,一共有四处:
parameterHandler=(ParameterHandler)interceptorChain.pluginAll(parameterHandler);resultSetHandler=(ResultSetHandler)interceptorChain.pluginAll(resultSetHandler);statementHandler=(StatementHandler)interceptorChain.pluginAll(statementHandler);executor=(Executor)interceptorChain.pluginAll(executor);这四处实现的原理都是一样的,我们只需要选择一个进行分析就可以了。
我们先来看下自定义的插件是如何加载进来的,比如我们使用PageHelper插件,通常会在mybatis-config.xml中加入如下的配置:
<plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"><!--configparamsasthefollowing--><propertyname="param1"value="value1"/></plugin></plugins>mybatis在创建SqlSessionFactory的时候会加载配置文件,
publicConfigurationparse(){ if(parsed){ thrownewBuilderException("EachXMLConfigBuildercanonlybeusedonce.");}parsed=true;parseConfiguration(parser.evalNode("/configuration"));returnconfiguration;}parseConfiguration方法会加载包括plugins在内的很多配置,
privatevoidparseConfiguration(XNoderoot){ try{ ...pluginElement(root.evalNode("plugins"));...}catch(Exceptione){ thrownewBuilderException("ErrorparsingSQLMapperConfiguration.Cause:"+e,e);}}privatevoidpluginElement(XNodeparent)throwsException{ if(parent!=null){ for(XNodechild:parent.getChildren()){ Stringinterceptor=child.getStringAttribute("interceptor");Propertiesproperties=child.getChildrenAsProperties();InterceptorinterceptorInstance=(Interceptor)resolveClass(interceptor).getDeclaredConstructor().newInstance();interceptorInstance.setProperties(properties);configuration.addInterceptor(interceptorInstance);}}}pluginElement干了几件事情:
创建Interceptor实例
设置实例的属性变量
添加到Configuration的interceptorChain拦截器链中
mybatis的插件是通过动态代理实现的,那肯定要生成代理对象,qq页面网站源码生成的逻辑就是前面提到的pluginAll方法,比如对于Executor生成代理对象就是,
executor=(Executor)interceptorChain.pluginAll(executor);接着看pluginAll方法,
/***该方法会遍历用户定义的插件实现类(Interceptor),并调用Interceptor的plugin方法,对target进行插件化处理,*即我们在实现自定义的Interceptor方法时,在plugin中需要根据自己的逻辑,对目标对象进行包装(代理),创建代理对象,*那我们就可以在该方法中使用Plugin#wrap来创建代理类。*/publicObjectpluginAll(Objecttarget){ for(Interceptorinterceptor:interceptors){ target=interceptor.plugin(target);}returntarget;}这里遍历所有我们定义的拦截器,调用拦截器的plugin方法生成代理对象。有人可能有疑问:如果有多个拦截器,target不是被覆盖了吗?
其实不会,所以如果有多个拦截器的话,生成的代理对象会被另一个代理对象代理,从而形成一个代理链条,执行的时候,依次执行所有拦截器的拦截逻辑代码。
plugin方法是接口Interceptor的默认实现类,
defaultObjectplugin(Objecttarget){ returnPlugin.wrap(target,this);}然后进入org.apache.ibatis.plugin.Plugin#wrap,
publicstaticObjectwrap(Objecttarget,Interceptorinterceptor){ Map<Class<?>,Set<Method>>signatureMap=getSignatureMap(interceptor);Class<?>type=target.getClass();Class<?>[]interfaces=getAllInterfaces(type,signatureMap);if(interfaces.length>0){ returnProxy.newProxyInstance(type.getClassLoader(),interfaces,newPlugin(target,interceptor,signatureMap));}returntarget;}首先是获取我们自己实现的Interceptor的方法签名映射表。然后获取需要代理的对象的Class上声明的所有接口。比如如果我们wrap的是Executor,就是Executor的所有接口。然后就是最关键的一步,用Proxy类创建一个代理对象(newProxyInstance)。
注意,newProxyInstance方法的第三个参数,接收的是一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。
我们这里传入的是Plugin类,故在动态运行过程中会执行Plugin的invoker方法。
如果对这一段不是很理解,建议先了解下java动态代理的原理。java动态代理机制中有两个重要的迷你世界 辅助 源码角色:InvocationHandler(接口)和Proxy(类),这个是背景知识需要掌握的。
我们在深入看下上面的getSignatureMap方法,
privatestaticMap<Class<?>,Set<Method>>getSignatureMap(Interceptorinterceptor){ //从Interceptor的类上获取Intercepts注解,说明我们自定义拦截器需要带注解InterceptsinterceptsAnnotation=interceptor.getClass().getAnnotation(Intercepts.class);//issue#if(interceptsAnnotation==null){ thrownewPluginException("No@Interceptsannotationwasfoundininterceptor"+interceptor.getClass().getName());}Signature[]sigs=interceptsAnnotation.value();Map<Class<?>,Set<Method>>signatureMap=newHashMap<>();//解析Interceptor的values属性(Signature[])数组,存入HashMap,Set<Method>>for(Signaturesig:sigs){ Set<Method>methods=MapUtil.computeIfAbsent(signatureMap,sig.type(),k->newHashSet<>());try{ Methodmethod=sig.type().getMethod(sig.method(),sig.args());methods.add(method);}catch(NoSuchMethodExceptione){ thrownewPluginException("Couldnotfindmethodon"+sig.type()+"named"+sig.method()+".Cause:"+e,e);}}returnsignatureMap;}首先需要从Interceptor的类上获取Intercepts注解,说明我们自定义拦截器需要带注解,比如PageHelper插件的定义如下:
<plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"><!--configparamsasthefollowing--><propertyname="param1"value="value1"/></plugin></plugins>0所以我们可以知道,getSignatureMap其实就是拿到我们自定义拦截器声明需要拦截的类以及类对应的方法。
前面说过,当我们调用代理对象时,最终会执行Plugin类的invoker方法,我们看下Plugin的invoker方法,
<plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"><!--configparamsasthefollowing--><propertyname="param1"value="value1"/></plugin></plugins>1Interceptor接口的intercept方法就是我们自定义拦截器需要实现的逻辑,其参数为Invocation,可从Invocation参数中拿到执行方法的对象,方法,方法参数,比如我们可以从statementHandler拿到SQL语句,实现自己的特殊逻辑。
在该方法的结束需要调用invocation#proceed()方法,进行拦截器链的传播。
参考:
blogs.com/chenpi/p/.html
推荐几款IDEA开发必备的经典好用插件,让代码飞起来!
提升IDEA开发体验,高效编写出高质量代码,这些经典好用的插件不容错过! 实用插件篇SonarLint:代码质量守护者,帮助发现并修复潜在漏洞,优化代码。
Maven Helper:简化依赖管理,轻松解决依赖冲突问题。
Alibaba Java Coding Guidelines:遵循编码规范,提升编码效率和项目速度。
Free Mybatis plugin:Mybatis文件间的便捷切换,提高开发效率。
MybatisX:Mybatis-Plus开发神器,自动生成代码并优化代码结构。
GitToolBox:版本管理助手,自动同步代码并显示详细信息。
Grep Console:快速定位日志,简化日志查找。
Translation:英文阅读助手,翻译源码注释,降低语言障碍。
Lombok:简化实体类,减少冗余代码,提高开发效率。
美化插件篇Material Theme UI:提供酷炫主题,美化IDEA界面。
Extra Icons:增强文件类型图标,提升视觉体验。
Background Image Plus:个性化背景设置,增强工作环境。
Code Glance:代码预览区域,全局视野一目了然。
想让IDEA开发更顺手,赶紧试试这些必备插件吧!哪些是值得在Cydia越狱商店下载的插件源码?
对于iPhone越狱用户,Cydia商店无疑是一片宝藏地。众多强大的插件源码等待挖掘,但选择哪款合适呢?别担心,让我们一起探索五个值得安装的插件源码。1. 大老板源</
作为正版插件的殿堂,大老板源是许多付费插件的首选之地,确保了你的手机安全且功能丰富。2. Cydia/Telesphoreo</
这个源码支持ACF2补丁下载,对于需要进行越狱操作的用户,借助PP手机助手源码,安装过程更加顺畅。3. ModMyi.com</
这个源主要提供美化插件,帮助你个性化你的手机界面,如和视频编辑。4. repo.ultrasn0wn</
ultrasn0w虽技术性强,但并非大众所需,适合少数技术爱好者。5. ZodTTDMacCiti</
虽有音乐和主题下载功能,但因其便捷度不高,许多用户会选择其他途径获取。必备插件源推荐:</
卫逢源</- apt.feng.com源码功能全面,几乎涵盖越狱所需的一切。 威锋精品来源</- 类似Repo.feng.com的强大插件源,越狱必备。 PP手机助手源码</- 尽管插件不多,但用于软件重编,是新手的好选择。 原创精品来源</- 专为中文用户设计,提供最新、易用的插件。黑客iPhone插件源</
强烈推荐,因其快速更新且保证质量,为你的手机带来更多可能性。 在Cydia的海洋中,挑选适合你的插件源是提升手机体验的关键步骤。安装这些推荐的源码,将为你的越狱之旅打下坚实基础。探索并安装,让iPhone 的潜力无限释放。良心推荐!几款收藏的神级IDEA插件分享
本文重点介绍了一些提升 IDEA 开发效率的神级插件,它们能够优化编码体验,使开发变得更轻松。 强烈推荐的插件有:CodeGlance:编辑区的迷你缩放图插件,支持快速定位,评级:★★★★★
GsonFormat:JSON 转 Java 类,提升开发速度,评级:★★★★★
POJO to Json:POJO 转 JSON,方便数据转换,评级:★★★★★
Rainbow Brackets:代码层次标识,提高代码阅读效率,评级:★★★★★
Translation:翻译插件,源码阅读的好帮手,评级:★★★★★
Lombok:简化代码,减少冗余,评级:★★★★★
其他实用插件包括 Maven Helper、Alibaba Java Code Guidelines、GenerateAllSetter、MybatisX 等,它们分别在依赖管理、代码规范、自动生成代码和数据库操作等方面提供便利。中文语言包和One Dark theme提供了良好的用户体验,而PlantUML Integration则是绘制技术文档的理想工具。 对于智能编码辅助,Tabnine和Tongyi Lingma提供了智能提示,而Git Commit Message Helper则有助于规范提交信息。记得定期更新和收藏这些插件,持续优化你的开发环境。款Visual Studio Code实用插件推荐
Visual Studio Code凭借其插件式设计,成为了开发者的得力工具。为了提升开发效率和避免长时间工作(如),这里精选了款实用的VS Code插件,助你优化工作流程。以下是其中一些关键插件:C# Dev Kit for VS Code:提供了C#开发的全方位支持,安装方法:Ctrl+Shift+x搜索C# Dev Kit。
C# for VS Code:C#语言的专门支持,安装方式:同样通过Ctrl+Shift+x搜索C#。
vscode-icons:提供个性化文件和文件夹图标,有助于代码管理,安装地址:marketplace.visualstudio.com。
Tabnine AI Autocomplete:AI代码补全工具,适用于多种语言,快速提升编码效率。
GitHub Copilot:AI辅助编程,智能代码建议,可在VS Code中使用。
CodeGeeX:强大智能助手,支持代码生成、注释和聊天功能。
Docker for VS Code:简化容器管理和部署,适用于Node.js、Python等。
Auto Close Tag:自动添加HTML/XML标签,前端开发者的好帮手。
Better Comments:智能注释工具,支持多种注释类型和样式。
ESLint:代码规范检查工具,提升代码质量。
GitLens:强大的Git源代码管理工具,提供代码作者信息和仓库浏览功能。
其他插件如Vue开发必备的Vetur、Element-UI助手、Angular Language Service等,助力特定框架开发。
以上插件均可以在VS Code的扩展市场(marketplace.visualstudio.com)轻松获取。通过这些工具,你可以更好地定制你的开发环境,提升编码体验和效率。如果你有更多的推荐,欢迎在文末留言分享。源码细读-深入了解terser-webpack-plugin的实现
深入探索 terser-webpack-plugin:代码压缩与优化的秘密</ terser-webpack-plugin 是一款强大的 webpack 插件,它巧妙地融合了 terser 库的功能,旨在为你的 JavaScript 代码带来高效且优雅的压缩体验。要开始使用,只需参考官方文档中关于 minify-options</的配置指导。这款插件在 webpack 的 compilation 阶段大展身手,通过 optimizeChunkAssets</钩子实现了异步的代码优化,核心逻辑则隐藏在了名为 optimise</的神秘函数中。 优化艺术</ 在 optimise</函数的舞台,一场资源名的魔术表演正在上演。它首先从 compilation 中获取资源,接着根据 availableNumberOfCores</动态决定是否启用并行模式,创建适当的 Worker</。在这里,pLimit</起到了关键作用,它巧妙地控制并发任务的数量,确保效率与稳定性并存。紧接着,遍历每一个 assetNames,一个个任务被 scheduleTask 准备就绪,等待着执行。 任务分解</ 而每个任务的核心 scheduleTask,就像拆解谜题一般,包含着获取 asset 信息、代码检查、minify 的选择(Worker 或主线程)、新代码生成和缓存更新,以及对资产内容的即时更新。整个过程紧凑而有序,以资源处理和并发控制为核心。 并行力量</ terser-webpack-plugin 的亮点之一就是其 parallel</功能,能根据你的计算机 CPU 核心数动态启动 worker,巧妙地利用了 jest-worker 线程池,优先选择高性能的 worker_threads 模式。它通过私有任务队列和先进先出 (FIFO) 管理机制,确保了多进程处理的高效性和一致性。 代码简化与压缩</ minify 函数的精妙之处在于,它直接调用 terser 库的强大功能,略过不必要的 comments 处理,通过出口 API 实现代码的高效压缩。这个过程既简洁又高效,确保了代码质量的提升。 全面优化流程</ terser-webpack-plugin 的优化流程井然有序:异步注册 optimizeChunkAssets</,开启多线程编译(Worker),并在 minify 阶段,利用 terser 的强大压缩能力对代码进行深度处理。而 v4 版本更是增添了异步优化点,让并行处理更加灵活和高效。2024-11-15 00:00
2024-11-14 23:46
2024-11-14 23:39
2024-11-14 23:18
2024-11-14 22:53