专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

把阿里云原生应用脚手架,搬到IntelliJIDEA中使用!

  作者:小傅哥
  博客:https:bugstack。cn
  沉淀、分享、成长,让自己和他人都能有所收获!
  Spring有一个脚手架https:start。spring。io阿里云也有一个脚手架https:start。aliyun。com但这些脚手架都是在网页端的,虽然也能在IntelliJIDEA进行使用,但总是不太方便。为此我决定,基于IntelliJIDEA的插件开发技术,扩展创建工程向导步骤,开发一个我用起来方便的工程脚手架。行动是产生结果的唯一方式!一、前言
  研发,要避免自嗨!
  你做这个东西的价值是什么?有竞品调研吗?能赋能业务吗?那不已经有同类的了,你为什么还自己造轮子?
  你是不是也会被问到这样的问题,甚至可能还有些头疼。但做的时候挺嗨,研究技术嘛,还落地了,多刺激。不过要说价值,好像一时半会还体现不出来,能不能赋能业务就不更不一定了。
  可谁又能保证以后不能呢,技术的点是一个个攻克尝试的才有机会再深度学习后把这些内容连成一片,就像单说水、单说沙子、单说泥巴,好像并没有啥用,但把它们凑到一块再给把火,就烧成了砖,砖就码成了墙,墙就盖成房。二、需求目的
  我们这一章节把freemarker能力与IDEAPlugin插件能力结合,开发一个DDD脚手架IDEA插件,可能你会想为什么要把脚手架开发到插件里呢?还有不是已经有了成型的脚手架可以用吗?
  首先我们目前看到的脚手架基本都是网页版的,也就是一次性创建工程使用,不过在我们实际使用的时候,还希望在工程创建过程中把数据库、ES、Redis等生成对应的ORM代码,减少开发工作量。并且在使用的工程骨架的过程中,还希望可以随着开发需要再次补充新的功能进去,这个时候网页版的脚手架都不能很好的支持了。此外一些大厂都会自己的技术体系,完全是使用市面的脚手架基本很难满足自身的需求,所以就需要有一个符合自己场景的脚手架了。
  那么,我们本章节就把脚手架的开发放到IDEA插件开发中,一方面学习脚手架的建设,另外一方面学习如何改变工程向导,创建出自己需要的DDD结构脚手架。三、案例开发1。工程结构guideideapluginscaffolding。gradlesrcmainjavacn。bugstack。guide。idea。plugindomainmodelProjectConfigVO。javaserviceimplProjectGeneratorImpl。javaAbstractProjectGenerator。javaFreemarkerConfiguration。javaIProjectGenerator。javafactoryTemplateFactory。javainfrastructureDataSetting。javaDataState。javaICONS。javaMsgBundle。javamoduleDDDModuleBuilder。javaDDDModuleConfigStep。javauiProjectConfigUI。javaProjectConfigUI。formresourcesMETAINFplugin。xmltemplatepom。ftlyml。ftlbuild。gradlegradle。properties
  公众号:bugstack虫洞栈回复:idea即可下载工程源码
  在此IDEA插件工程中,主要分为5块区域:domain:领域层,提供创建DDD模板工程的服务,其实这部分主要使用的就是freemarkerfactory:工厂层,提供工程创建模板,这一层的作用就是我们在IDEA中创建新工程的时候,可以添加上我们自己的内容,也就是创建出我们定义好的DDD工程结构。infrastructure:基础层,提供数据存放、图片加载、信息映射这些功能。module:模块层,提供DDD模板工程的创建具体操作和步骤,也就是说我们创建工程的时候是一步步选择的,你可以按需添加自己的步骤页面,允许用户选择和添加自己需要的内容。比如你需要连库、选择表、添加工程所需要的技术栈等ui:界面层,提供Swing开发的UI界面,用于用户图形化选择和创建。2。UI工程配置窗体
  publicclassProjectConfigUI{privateJPanelmainPanel;privateJTextFieldgroupIdField;privateJTextFieldartifactIdField;privateJTextFieldversionField;privateJTextFieldpackageField;}使用SwingUIDesigner创建一个配置工厂信息的UI窗体,通过这样的方式创建可以直接拖拽。在这个UI窗体中我们主要需要;roupId、artifactId、version、package3。配置工程步骤创建3。1数据存放
  cn。bugstack。guide。idea。plugin。infrastructure。DataSettingState(nameDataSetting,storagesStorage(plugin。xml))publicclassDataSettingimplementsPersistentStateComponentDataState{privateDataStatestatenewDataState();publicstaticDataSettinggetInstance(){returnServiceManager。getService(DataSetting。class);}NullableOverridepublicDataStategetState(){returnstate;}OverridepublicvoidloadState(NotNullDataStatestate){this。statestate;}publicProjectConfigVOgetProjectConfig(){returnstate。getProjectConfigVO();}}在基础层提供数据存放的服务,把创建工程的配置信息存放到服务中,这样比较方便设置和获取。3。2扩展步骤
  cn。bugstack。guide。idea。plugin。module。DDDModuleConfigSteppublicclassDDDModuleConfigStepextendsModuleWizardStep{privateProjectConfigUIprojectConfigUI;publicDDDModuleConfigStep(ProjectConfigUIprojectConfigUI){this。projectConfigUIprojectConfigUI;}OverridepublicJComponentgetComponent(){returnprojectConfigUI。getComponent();}Overridepublicbooleanvalidate()throwsConfigurationException{获取配置信息,写入到DataSettingProjectConfigVOprojectConfigDataSetting。getInstance()。getProjectConfig();projectConfig。setgroupId(projectConfigUI。getGroupIdField()。getText());projectConfig。setartifactId(projectConfigUI。getArtifactIdField()。getText());projectConfig。setversion(projectConfigUI。getVersionField()。getText());projectConfig。setpackage(projectConfigUI。getPackageField()。getText());returnsuper。validate();}}继承ModuleWizardStep开发一个自己需要的步骤,这个步骤就会出现到我们创建新的工程中。同时在重写的validate方法中,把从工程配置UI窗体中获取到信息,写入到数据配置文件中。3。3配置步骤
  cn。bugstack。guide。idea。plugin。module。DDDModuleBuilderpublicclassDDDModuleBuilderextendsModuleBuilder{privateIProjectGeneratorprojectGeneratornewProjectGeneratorImpl();OverridepublicIcongetNodeIcon(){returnICONS。SPRINGBOOT;}重写builderId挂载自定义模板NullableOverridepublicStringgetBuilderId(){returngetClass()。getName();}OverridepublicModuleWizardStep〔〕createWizardSteps(NotNullWizardContextwizardContext,NotNullModulesProvidermodulesProvider){添加工程配置步骤,可以自己定义需要的步骤,如果有多个可以依次添加DDDModuleConfigStepmoduleConfigStepnewDDDModuleConfigStep(newProjectConfigUI());returnnewModuleWizardStep〔〕{moduleConfigStep};}}在createWizardSteps方法中,把我们已经创建好的DDDModuleConfigStep添加工程配置步骤,可以自己定义需要的步骤,如果有多个可以依次添加。同时需要注意,只有重写了getBuilderId()方法后,你新增加的向导步骤才能生效。4。开发脚手架服务
  cn。bugstack。guide。idea。plugin。domain。service。AbstractProjectGenerator
  publicabstractclassAbstractProjectGeneratorextendsFreemarkerConfigurationimplementsIProjectGenerator{OverridepublicvoiddoGenerator(Projectproject,StringentryPath,ProjectConfigVOprojectConfig){1。创建工程主POM文件generateProjectPOM(project,entryPath,projectConfig);2。创建四层架构generateProjectDDD(project,entryPath,projectConfig);3。创建ApplicationgenerateApplication(project,entryPath,projectConfig);4。创建YmlgenerateYml(project,entryPath,projectConfig);5。创建CommongenerateCommon(project,entryPath,projectConfig);}}在domain领域层添加用于创建脚手架框架的FreeMarker服务,它是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。FreeMarker在线手册:http:freemarker。foofun。cn按照DDD工程结构,分层包括:application、domain、infrastructure、interfaces,那么我们把这些创建过程抽象到模板方法中,具体交给子类来创建。5。调用脚手架服务
  cn。bugstack。guide。idea。plugin。module。DDDModuleBuilderpublicclassDDDModuleBuilderextendsModuleBuilder{privateIProjectGeneratorprojectGeneratornewProjectGeneratorImpl();OverridepublicIcongetNodeIcon(){returnICONS。SPRINGBOOT;}OverridepublicvoidsetupRootModel(NotNullModifiableRootModelrootModel)throwsConfigurationException{设置JDKif(null!this。myJdk){rootModel。setSdk(this。myJdk);}else{rootModel。inheritSdk();}生成工程路径StringpathFileUtil。toSystemIndependentName(Objects。requireNonNull(getContentEntryPath()));newFile(path)。mkdirs();VirtualFilevirtualFileLocalFileSystem。getInstance()。refreshAndFindFileByPath(path);rootModel。addContentEntry(virtualFile);ProjectprojectrootModel。getProject();创建工程结构Runnabler()newWriteCommandActionVirtualFile(project){Overrideprotectedvoidrun(NotNullResultVirtualFileresult)throwsThrowable{projectGenerator。doGenerator(project,getContentEntryPath(),DataSetting。getInstance()。getProjectConfig());}}。execute();}}在DDDModuleBuildersetupRootModel中,添加创建DDD工程框架的服务,projectGenerator。doGenerator(project,getContentEntryPath(),DataSetting。getInstance()。getProjectConfig());另外这里需要用到IDEA提供的线程调用方法,newWriteCommandAction才能正常创建。6。配置模板工程6。1模板工厂
  cn。bugstack。guide。idea。plugin。factory。TemplateFactorypublicclassTemplateFactoryextendsProjectTemplatesFactory{NotNullOverridepublicString〔〕getGroups(){returnnewString〔〕{DDD脚手架};}OverridepublicIcongetGroupIcon(Stringgroup){returnICONS。DDD;}NotNullOverridepublicProjectTemplate〔〕createTemplates(NullableStringgroup,WizardContextcontext){returnnewProjectTemplate〔〕{newBuilderBasedTemplate(newDDDModuleBuilder())};}}模板工厂的核心在于把我们用于创建DDD的步骤添加createTemplates方法中,这样算把整个创建自定义脚手架工程的链路就串联完成了。6。2文件配置
  plugin。xmlideapluginidcn。bugstack。guide。idea。plugin。guideideapluginscaffoldingidnameScaffoldingnamevendoremail184172133qq。comurlhttps:bugstack。cn小傅哥vendor!pleaseseehttp:www。jetbrains。orgintellijsdkdocsbasicsgettingstartedplugincompatibility。htmlonhowtotargetdifferentproductsdependscom。intellij。modules。platformdependsextensionsdefaultExtensionNscom。intellijprojectTemplatesFactoryimplementationcn。bugstack。guide。idea。plugin。factory。TemplateFactoryextensionsideaplugin接下来还需要把我们创建的工程模板以及数据服务配置到plugin。xml中,这样在插件启动的时候就可以把我们自己插件启动起来了。四、测试验证点击Plugin启动IDEA插件,之后创建工程如下:
  快拿去试试吧,启动插件,点击创建工程,傻瓜式点击,就可以创建出一个DDD工程结构了。五、总结学习使用IDEAPlugin开发技术,改变创建工程向导,添加自己需要的工程创建模板,这样就可以创建出一个DDD脚手架工程骨架了,接下来你还可以结合自己实际的业务场景添加自己需要的一些技术栈到脚手架中。如果你愿意尝试可以在工程创建中链接到数据库,把数据库中对应的表生成Java代码,这样一些简单的配置、查询、映射,就不用自己动手写了。在开发DDD脚手架的源码中还有一些细节过程,包括图标的展示、文案的信息、Freemarker的使用细节,这些你都可以在源码中学习并调试验证。

黄埔这条徒步线,带你发现春日小惊喜!春风十里,阳光明媚,是时候探寻一条适合春日轻徒步的打卡线路了!小编打卡长岭国家登山健步道,发现黄麻段登山道又添不少小惊喜!森林中的小精灵春日来长岭国家登山健步道黄麻路段徒步的朋友们行星孵化器,星云的凝结和崩塌,或将形成行星?多年来,科学家们认为行星只在恒星周围形成,这是原行星盘中小粒子和碎片引力相互作用的结果。然而,最近的发现表明,行星也可能直接由星际气体云形成,而不需要恒星作为催化剂。星际气体云是存八换二报价戴维斯,史密斯成筹码,火箭欲建超级四巨头组合在最近几场比赛,火箭队表现最好的球员要属小贾巴里史密斯了。在和步行者队的比赛中,他拿下了职业生涯最高的30分,一记压哨三分帮助火箭队追平了比分。在经过和步行者队的比赛之后,史密斯打航天发射接连爆炸,日本却孤注一掷,要研制可回收的复用火箭?日本航天从去年到今年,几乎吃了个大鸭蛋,甚至经历了两次火箭爆炸,一次是去年10月12日艾普斯龙小型固体火箭6号箭发射失败,不得不人为引爆。其次是日本新一代运载火箭H3的首发箭,在经泰媒森林大火不断清迈成世界空气污染最严重城市据曼谷邮报报道,泰国北部著名旅游景点清迈近来持续遭遇森林大火,滚滚浓烟直窜天际,使当地连续第二天被列为世界上空气污染最严重的城市。报道称,瑞士空气净化器公司IQAir集团的数据显示米哈游投资造火箭马斯克裁员高招曝光三星拍月亮是照骗日报君发自凹非寺量子位公众号QbitAI大家好,今天是3月13日星期一,新的一周开始了。先来和日报君一起看看最近科技圈都发生了哪些大事吧马斯克辞退高薪员工伎俩曝光为了省钱,马斯克可深度剖析唐朝的两税法改革,它对唐朝的土地制度产生了什么影响?文扶苏论编辑扶苏论前言土地制度的变迁通常左右着社会政治经济的走向,一个王朝的强盛,势必伴随着一套适应当时社会发展的完善的土地制度。而唐朝的土地制度是均田制,这种制度主要是通过对土地出境游市场迎春风!厦门旅行社深度化精细化运营旅游产品供图视觉中国日前,文旅部公布第二批恢复出境团队游业务的国家名单,赴有关国家及地区出境团队旅游业务将于15日起试点恢复。至此,国内已开放出境团队游试点的目的地国家达到60个。自出境团深度解读中国经济面临的机遇以下是一些可能的机遇1。加速数字化转型2023年两会可能会进一步推动数字化转型,尤其是在新基建人工智能大数据和物联网等领域。这将为中国的创新和科技发展提供更广泛的空间和支持。数字化改革要体现公平性,机构改革也需要国企改革的力度和深度机构改革,精兵简政,减少财政供养人员,减轻财政负担,已经是民心所向。然而过去的多次的机构改革,收到成效有限,其根本原因就是改革力度不够,没有像当初的国企改革那样的深度和力度。当初为我国女性终身无孩率快速飙升,为什么女性都不愿意生育了头条创作挑战赛人口负数对于年轻人多一些理解少一些批评随着2022年人口出生为负数以来,人口生育下降的事实又一次摆在人们面前。除了一些不靠谱专家胡说让人们议论一番以外,人口出生率下降
觉得烦了累了,就看看这段话,人生逆境,路要自己走,苦要自己扛情感点评大赏沈近思说过草木不经霜雪,则生意不固吾人不经忧患,则德慧不成。意思就是说人不经历苦楚,难以担当大事。没有吃苦,何来的安逸生活?逆境是有科学价值的,任何聪明人都不会放弃这段有你真好,我想你了我的好朋友,好闺蜜。多年未见,甚是想念。你热情自信,待人友善。想念你那比花娇的灿烂笑容,想念你热情地拥抱。世界因你而美丽,世界因你而变得有趣灿烂多彩。而我因为有你感受到人间有真情,人生,一切随缘,凡事不可强求文飞鱼01hr人生就是一场随缘的过程,很多事情都是注定的,是无法左右的,该来的人始终会来,该走的人,也始终会离开的,该发生的事情,躲也躲不掉,不会发生的事情,也始终不会发生,凡事不揭秘!苹果如何不让iPhone14Pro的灵动岛提前泄露的?如果想要保护品牌商标权就得提早注册,那就无法保证不泄密。如果想要保密在发布会给用户以惊喜,那也得做好版权流氓疯狂抢注的准备。对于不少硬件公司而言,这是一个两难的问题。最终苹果釜底抽以太坊合并来临,市场利好云集,ETH行情却毫无波动据OKLink多链浏览器TheMerge倒计时页面显示,距以太坊合并还剩不足1000个区块,合并进度已达99。99。当前区块高度为15536369,按当前的区块难度和实时算力计算,2022新能源车质量摸底考奇瑞QQ冰淇淋第一,被誉为全科学霸新能源汽车界有个吐槽榜,排名越高的汽车被吐槽得越少,质量也就越好。近期,权威机构君迪对众多汽车进行质量摸底考,更新了这份榜单,奇瑞QQ冰淇淋成为小型纯电动中的第一名。这份成绩还挺亮势不可挡!运营商政企市场正在快速崛起无论我平时如何调侃嘲讽三大运营商但对于它们的执行力,我是衷心的佩服尤其是近34年,运营商似乎终于找到了改革的下潜器很多改革措施终于能够从天花板落到了基层,深入到肌理比如,中国移动针直击iphone14发售武汉现场排队不长,有丈母娘一早替女婿踩点9月16日,iphone14系列线下发售首日。早上八点半,距离武汉国际广场购物中心开门还有一个半小时,C座入口处已有十几位前来取货的苹果手机顾客在排队,苹果直营店位于该座二楼。门店杨元庆终于被司马南骂醒了,联想自研5nm点亮成功光阴荏苒,岁月如梭马上就要迎来司马南联想一周年这时候网络开始流传联想自研5nmArm框架芯片回片点亮成功,确实值得聊一聊唉呀妈呀真的假的关于粉丝喜欢往司马南脸上贴金,说联想是因为被第四届科学探索奖揭晓3名四川科学家入选,每人300万奖金9月16日,红星新闻记者获悉,第四届科学探索奖获奖名单揭晓,50位青年科学家榜上有名,他们将在未来5年各获得300万奖金。其中,有3名四川科学家入选,他们是电子科技大学自动化工程学不断努力!中国5G毫米波芯片研发成功,美国休想再卡脖子在产业发展的操作过程之中能有自身的影响,产业发展科技事业是十分关键的,他们那时就有许多较为悲惨的经验教训,在信息技术产业发展上他们由于研发的总体实力不足,因此在许多的工艺技术各方面
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网