首页 文章 精选 留言 我的

精选列表

搜索[最权威安装],共10000篇文章
优秀的个人博客,低调大师

MakuBoot v2.5 发布,简洁的快速开发平台

介绍 maku-boot 是采用 SpringBoot、SpringSecurity、Mybatis-Plus 等框架,开发的一套 SpringBoot 快速开发平台,使用门槛极低,且采用 MIT 开源协议,完全免费开源,可免费用于商业项目等场景。 采用组件模式,扩展不同的业务功能,可以很方便的实现各种业务需求,且不会导致系统臃肿,若想使用某个组件,按需引入即可,反之亦然。 官网地址:https://maku.net 演示环境:https://demo.maku.net/maku-boot 更新日志 新增easy trans依赖 修改登录日志导出的ExcelVO改为使用easy trans的字典翻译功能实现 修改用户导出的ExcelVO改为使用easy trans的字典翻译功能实现 ExcelUtil 新增parseDict方法,用于反向解析字典翻译结果到字典value字段上 用户分页接口去掉和org表的关联,使用easy trans的simple trans实现orgid 拿orgName的过程 新增字典标签的tag 升级element-plus到2.2.26 感谢@fhs_opensource@王祁 前端工程 Gitee 仓库:https://gitee.com/makunet/maku-admin Github 仓库:https://github.com/makunet/maku-admin 后端工程 Gitee 仓库:https://gitee.com/makunet/maku-boot Github 仓库:https://github.com/makunet/maku-boot 代码生成器 Gitee 仓库:https://gitee.com/makunet/maku-generator Github 仓库:https://github.com/makunet/maku-generator 架构图 效果图

优秀的个人博客,低调大师

MakuBoot v2.4 发布,简洁的快速开发平台

介绍 maku-boot 是采用 SpringBoot、SpringSecurity、Mybatis-Plus 等框架,开发的一套 SpringBoot 快速开发平台,使用门槛极低,且采用 MIT 开源协议,完全免费开源,可免费用于商业项目等场景。 采用组件模式,扩展不同的业务功能,可以很方便的实现各种业务需求,且不会导致系统臃肿,若想使用某个组件,按需引入即可,反之亦然。 官网地址:https://maku.net 演示环境:https://demo.maku.net/maku-boot 更新日志 新增系统服务监控 新增缓存服务监控 新增SpringBootAdmin监控 新增接口文档菜单 优化Web配置项 升级springboot到2.7.6 升级element-plus到2.2.25 升级代码生成器依赖 解决代码生成器表单模板问题 前端工程 Gitee 仓库:https://gitee.com/makunet/maku-admin Github 仓库:https://github.com/makunet/maku-admin 后端工程 Gitee 仓库:https://gitee.com/makunet/maku-boot Github 仓库:https://github.com/makunet/maku-boot 代码生成器 Gitee 仓库:https://gitee.com/makunet/maku-generator Github 仓库:https://github.com/makunet/maku-generator 架构图 效果图

优秀的个人博客,低调大师

MakuBoot v2.2 发布,简洁的快速开发平台

介绍 maku-boot 是采用 SpringBoot、SpringSecurity、Mybatis-Plus 等框架,开发的一套 SpringBoot 快速开发平台,使用门槛极低,且采用 MIT 开源协议,完全免费开源,可免费用于商业项目等场景。 采用组件模式,扩展不同的业务功能,可以很方便的实现各种业务需求,且不会导致系统臃肿,若想使用某个组件,按需引入即可,反之亦然。 官网地址:https://maku.net 开发文档:https://maku.net/docs/maku-boot 演示环境:https://demo.maku.net/maku-boot 更新日志 新增excel导出功能 新增分栏、横向菜单布局 完善数据字典,支持动态SQL 升级springboot到2.7.5 升级vite3.1.8 升级vue-router 4.1.5 升级element-plus到2.2.18 前端工程 Gitee 仓库:https://gitee.com/makunet/maku-admin Github 仓库:https://github.com/makunet/maku-admin 后端工程 Gitee 仓库:https://gitee.com/makunet/maku-boot Github 仓库:https://github.com/makunet/maku-boot 代码生成器 Gitee 仓库:https://gitee.com/makunet/maku-generator Github 仓库:https://github.com/makunet/maku-generator 架构图 效果图

优秀的个人博客,低调大师

fastposter v2.9.2 简单的海报生成器

fastposter v2.9.2 程序员必备海报生成器 🔥🔥🔥 fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图,在对应的位置放上组件(文字、图片、二维🐴、头像)即可生成海报。 点击代码直接生成各种语言的调用代码,方便快速开发。 现已服务众多电商类项⽬,多个项⽬有50W+⽤户,通过多年⽣产环境的考验,稳定可靠。广泛应用于各类电商、分销系统、电商海报、电商主图等海报生成和制作场景。 社区版 v2.9.2 发布 升级requests_cache==0.9.6 升级tornado==6.2 代码整理 专业版 v2.0.12 发布 通过参数处理图片,支持scale缩放 增加独立二维码生成接口 批量生成,更改fp_batch表的字段rows -> raw (适配数据库) java版本增加postgres数据库支持 依赖版本升级 Pillow==9.2.0 requests==2.28.1 requests_cache==0.9.6 相关地址 开发文档:https://poster.prodapi.cn/doc/ 在线演示:https://poster.prodapi.cn/ 专业版Python在线演示:https://poster.prodapi.cn/pro/ 专业版Java在线演示:https://poster.prodapi.cn/pro/java/ 只需三步,即可完成海报开发 一、启动服务 docker run -it --name fast-poster -p 5000:5000 tangweixin/fast-poster 二、编辑海报 三、生成代码 请求示例(可直接传递需要的参数) curl --location --request POST 'https://poster.prodapi.cn/api/link' \\ --header 'Content-Type: application/json' \\ --header 'token: ApfrIzxCoK1DwNZOEJCwlrnv6QZ0PCdv' \\ --data-raw '{ "title": "人工智能+机器学习", "id": 2 }' 响应示例(返回海报的访问地址) { "code": 0, "msg": "success", "data": { "url": "https://poster.prodapi.cn/v/90295c118d4c8802" } } 适用场景: 海报生成器 海报自动生成工具 海报在线设计生成器 海报生成器在线制作 生成朋友圈海报 电商海报编辑器 证书制作 证书自动生成工具 Python Pillow绘图 Pillow制作海报 电商主图编辑器 Java生成分享海报图片 微信小程序生成海报分享朋友圈 PHP生成海报图片 自定义商业海报图片 H5生成海报图片 canvas生成海报图片 通过JSON生成海报图片 BufferdImage绘制图片

优秀的个人博客,低调大师

23种设计模式,w的方式,讲给你听

01 工厂方法追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。02 建造者模式MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。03 抽象工厂请 MM 去麦当劳吃汉堡,不同的 MM 有不同的口味,要每个都记住是一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说「要一个汉堡」,具体要什么样的汉堡呢,让 MM 直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。04 原型模式跟 MM 用 QQ 聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要 copy 出来放到 QQ 里面就行了,这就是我的情话 prototype 了。(100 块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。05 单态模式俺有 6 个漂亮的老婆,她们的老公都是我,我就是我们家里的老公 Sigleton,她们只要说道「老公」,都是指的同一个人,那就是我 (刚才做了个梦啦,哪有这么好的事)单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 “单一实例” 的需求时才可使用。06 适配器模式在朋友聚会上碰到了一个美女 Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友 kent 了,他作为我和 Sarah 之间的 Adapter,让我和 Sarah 可以相互交谈了 (也不知道他会不会耍我)适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。07 桥梁模式早上碰到 MM,要说早上好,晚上碰到 MM,要说晚上好;碰到 MM 穿了件新衣服,要说你的衣服好漂亮哦,碰到 MM 新做的发型,要说你的头发好漂亮哦。不要问我 “早上碰到 MM 新做了个发型怎么说” 这种问题,自己用 BRIDGE 组合一下不就行了桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合 / 聚合关系而不是继承关系,从而使两者可以独立的变化。08 合成模式Mary 今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件 T 恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T 恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”,MM 都会用 Composite 模式了,你会了没有?合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。09 装饰模式Mary 过完轮到 Sarly 过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上 “最好的的礼物,就是爱你的 Fita”,再到街上礼品店买了个像框(卖礼品的 MM 也很漂亮哦),再找隔壁搞美术设计的 Mike 设计了一个漂亮的盒子装起来……,我们都是 Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。10 门面模式我有一个专业的 Nikon 相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但 MM 可不懂这些,教了半天也不会。幸好相机有 Facade 设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样 MM 也可以用这个相机给我拍张照片了。门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。11 享元模式每天跟 MM 发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上 MM 的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是 Flyweight,MM 的名字就是提取出来的外部特征,根据上下文情况使用。享元模式:FLYWEIGHT 在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。12 代理模式跟 MM 在网上聊天,一开头总是 “hi, 你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?” 这些话,真烦人,写个程序做为我的 Proxy 吧,凡是接收到这些话都设置好了自己的回答,接收到其他的话时再通知我回答,怎么样,酷吧。代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。13 责任链模式晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的 MM 哎,找张纸条,写上 “Hi, 可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的 MM 把纸条传给老师了,听说是个老处女呀,快跑!责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。14 命令模式俺有一个 MM 家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个 COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送 COMMAND,就数你最小气,才请我吃面。”命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。15 解释器模式俺有一个《泡 MM 真经》,上面有各种泡 MM 的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟 MM 约会时,只要做一个 Interpreter,照着上面的脚本执行就可以了。解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。16 迭代模式我爱上了 Mary,不顾一切的向她求婚。Mary:“想要我跟你结婚,得答应我的条件” 我:“什么条件我都答应,你说吧” Mary:“我看上了那个一克拉的钻石” 我:“我买,我买,还有吗?” Mary:“我看上了湖边的那栋别墅” 我:“我买,我买,还有吗?” Mary:“我看上那辆法拉利跑车” 我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”迭代模式:迭代模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。17 调停者模式四个 MM 打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就 OK 啦,俺得到了四个 MM 的电话。调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。18 备忘录模式同时跟几个 MM 聊天时,一定要记清楚刚才跟 MM 说了些什么话,不然 MM 发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个 MM 说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。19 观察者模式想知道咱们公司最新 MM 情报吗?加入公司的 MM 情报邮件组就行了,tom 负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。关注微信订阅号果汁简历回复设计模式还有视频版本哦20 状态模式跟 MM 交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的 MM 就会说 “有事情啦”,对你不讨厌但还没喜欢上的 MM 就会说 “好啊,不过可以带上我同事么?”,已经喜欢上你的 MM 就会说 “几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把 MM 的状态从不讨厌不喜欢变成喜欢哦。状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。21 策略模式跟不同类型的 MM 约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到 MM 的芳心,我的追 MM 锦囊中有好多 Strategy 哦。策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。22 模板方法模式看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤 (Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦 (具体实现);模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。23 访问者模式情人节到了,要给每个 MM 送一束鲜花和一张卡片,可是每个 MM 送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下 Visitor,让花店老板根据 MM 的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。来源 |zhuanlan.zhihu.com/p/100746724 如有收获请划至底部 点击“在看”支持,谢谢! 本文分享自微信公众号 - 进阶架构师(Lele521Lyy)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

简单的设计模式不会还有人不会吧!

前言 掌握设计模式的层次 刚开始学编程不久,听说过什么是设计模式 由很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道 学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的 阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会设计模式的精妙和带来的好处。 代码写着写着,字节都没有意识到使用了设计模式,并且熟练的写了出来。 设计模式介绍 设计模式是程序员再面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是 某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的时间的试验和错误总结出来的。 设计模式的本质提高软件的维护性,通用性和扩展性,并降低软件的复杂度。 设计模式分为三种类型,共23种 创建型模式:单例模式,抽象工厂模式,原型模式,建造者模式,工程模式。 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式 行为型模式:模块方法模式,命令模式,访问者模式,迭代模式,观察者模式,中介者模式,备忘录模式,解释器模式(Interpreter模式),状态模式,策略模式,职责链模式(责任链模式) 注意:不同的书籍上对分类和名称略有差别。 单例模式 单例模式介绍 ​ 所谓类的单例设计模式,就是采取一定的方法保证再整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供了一个取得对象实例的方法(静态方法)。 ​ 比如Hibernate的SessionFactory,他充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactoury就够,这是就会用到单例模式。 单例设计模式有八种写法 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 饿汉式(静态常量) 步骤如下: 构造器私有化(防止 new) 类的内部创建对象 向外暴露一个静态的公共方法。gentInstance 代码实现 public class SingletonTest1 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() {} //2. 在本类内部创建对象实例 private final static Singleton instance = new Singleton(); //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 优缺点说明 优点;这种写法比较简单,就是再类装载的时候就完成实例化。避免了线程同步问题。 缺点;再类装载的时候就完成实例化,没有达到Lazy Loading(懒加载)的效果。如果从始至终从未使用这个实例,则会造成内存的浪费。 这种方法基于classloder机制避免了多线程的同步问题,不过,instance再类装载时就实例化,再单例模式种大多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果 结论;这种单例模式可用,可能造成内存浪费。 饿汉式(静态代码块) 代码 public class SingletonTest2 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() { } //2. 在本类内部创建对象实例 private static Singleton instance; //在静态代码块中,创建对象 static { instance = new Singleton(); } //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 优缺点说明 这种方式和上面的方式其实类似,只不过将类实例的过程放在了静态代码块中,也是再类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。 结论;这种单例模式可用,但是可能造成内存浪费。 懒汉式(线程不安全) 代码 public class SingletonTest03 { public static void main(String[] args) { //测试 System.out.println("懒汉式1,线程不安全"); Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } class Singleton { private static Singleton instance; public Singleton() { } //提供一个静态的共有方法,当使用该方法时,才去创建instance //即懒汉式 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 优点说明 起到Lazy Loading的效果,但是只能再单线程下使用。 如果再多线程下,一个线程进入if(singlenton == null) 判断语句块,还未来得及往下执行,另一个线程也通过这个判断语句,这是便会差生多个实例。所以再多线程环境下不可使用这种方式。 结论:再实际开发中,不要使用这种方式。 懒汉式(线程安全,同步方法) 代码 class Singleton{ private static Singleton singlenton; private Singleton(){} //加入了同步代码,解决线程不安全问题 public static synchronized Singlenton getInstance(){ if(singleton==null){ singleton=new Singleton(); } return singleton; } } 优缺点说明 解决了线程不安全的问题 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方式执行一次实例化代码就够了,后面的想获得该类实例直接return就行了。方法进行同步效率太低 结论;在实际开发中,不推荐使用这种方式。 懒汉式(线程安全,同步代码块) 代码 class Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //同代码块 synchronized (Singleton.class){ singleton=new Singleton(); } return singleton; } } } 优缺点说明 这种方式,本意是相对四种方法的改进,因为前面同步方法效率太低,改为同步生产实例的代码块。 <font color="red">但是这种同步并不能起到线程同步的作用</font>。跟第三种实现方式遇到的情形一致,加入一个线程进入了if(singleton==null)判断语句块,还未来得及往下执行,另外一个线程也通过了这个判断语句,这时便会产生多个实例。 结论:在实际开发中,不能使用这种方式。 双重检查 代码演示 class Singleton{ //volatile把它认为是一个轻量级的synchronized private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //保证只有一个线程在这里执行,当下一个线程进来的时候, //上一个线程已经创建完了singleton已经不等于null了,就不会创建了 //提供一个静态的共有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题 //同时保证了效率,推荐使用 synchronized(Singleton.class){ if(singleton==null){ singleton=new Singleton(); } } } return singleton; } } 优缺点说明 Double-“Check概念是多线程开发中常使用的,如果代码中所示,我们进行了两次if(singleton==null)检查,这样就可以保证线程安全了。 这样,实例化代码只用执行一次,后面再次访问时,判断if(singleton==null),直接return实例化对象,也避免的反复进行方法同步。 线程安全;延迟加载;效率较高 结论;在实际开发中,推荐使用这种单例设计模式。 静态内部类 代码演示 //当外部类装载的时候静态内部类不会被装载的 //当我们调用静态方法时静态内部类的时候只会装载一次,而且装载的时候线程是安全的。 public class SingletonTest07 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//instance1.hashCode=1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//instance1.hashCode=1163157884 } } //静态内部类完成,推荐使用 class Singleton { //构造器私有化 private Singleton() { } //写静态内部类,该类有一个静态属性 private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } //提供一个静态的共有方法,直接返回SingletonInstance.INSTANCE public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } 优缺点说明 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时调用getInstance方法,才会装载Singleton Instance类,从而完成Singleton的实例化。 类的静态属性只会加载类的时候初始化,所以在这里,jvm帮助我们保证了线程的安全性,再类进行初始化时,别的线程是无法进入的。 优点;避免了线程不安全,利用静态内部类特点实现延迟加载,效率高 结论;推荐使用。 枚举 代码实例 public class SingletonTest8 { public static void main(String[] args) { Singleton instance = Singleton.INSTANCE; Singleton instance2 = Singleton.INSTANCE; System.out.println(instance == instance2);//true System.out.println(instance.hashCode());//1163157884 System.out.println(instance2.hashCode());//1163157884 instance.sayOK(); } } //使用枚举可以实现单例,推荐使用 enum Singleton { INSTANCE; public void sayOK() { System.out.println("ok~");} } 优缺点说明 这借助jdk1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。 这种方式式Effective java作者 josh bloch 提倡的方式 结论;推荐使用 单例模式在jdk应用的源码分析 单例模式在jdk应用的源码分析 我们jdk中 java.lang.Runtime 就是经典的单例模式 代码分析+Ddbug源码+代码说明 //单例设计模式的懒汉式 public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } private Runtime() {} 单例模式注意事项和细节说明 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能 当想实例一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new 单例模式使用的场景:需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象,工具类对象,频繁访问数据库或文件的对象(比如数据源,session工程等)

优秀的个人博客,低调大师

MATA,2020年危险的多平台恶意软件框架

卡巴斯基的安全研究人员近日发现了一个名为“MATA”的活跃多平台恶意软件框架,该框架功能非常全面,支持Windows、Linux和MacOS等多个主流平台,拥有多个组件,例如加载程序、编排器和插件,全球企业都在其攻击“射程”范围内。 在官方博客上,卡巴斯基实验室(Kaspersky Lab)透露已经与威胁情报门户(Threat Intelligence Portal)的客户共享了MATA的研究信息,主要内容如下: 与MATA有关的第一批工件出现在2018年4月。然后,恶意软件框架的幕后行为者积极地渗透包括波兰、德国、土耳其、韩国、日本和印度在内的全球范围的企业实体。已经发现的受害者中有一家软件公司、一家电子商务企业和一家互联网服务提供商(ISP)。 通过对已知攻击的分析,研究者弄清楚了该恶意软件框架的目的。例如,在一个组织中,恶意行为者使用该框架查询受害者的数据库,以获取客户列表。攻击者还利用MATA分发了VHD勒索软件。 MATA三个版本(Windows、Linux和MacOS)的主要信息如下: 1. Windows 版本 Windows 版本 MATA的组件 来源:卡巴斯基实验室 MATA的Windows版本由几个组件组成,其中包括装载程序恶意软件和编排器元素。装在程序使用硬编码的十六进制字符串调用加密的有效负载。此操作为协调器加载插件文件并在内存中执行它们铺平了道路。这些插件使攻击者能够篡改文件,创建HTTP代理服务器并执行其他任务。 (1) 加载器 该加载器采用一个硬编码的十六进制字符串,将其转换为二进制并对其进行AES解密,以获得有效负载文件的路径。每个加载程序都有一个硬编码的路径来加载加密的有效负载。然后,将有效负载文件进行AES解密并加载。 从一个受感染的受害者那发现的加载程序恶意软件中,研究人员发现执行加载程序恶意软件的父进程是“C:\Windows\System32\wbem\WmiPrvSE.exe”进程。WmiPrvSE.exe进程是“WMI Provider Host进程”,通常意味着参与者已从远程主机执行了该加载程序恶意软件,以进行横向移动。因此,攻击者很可能是使用此加载程序来破坏同一网络中的其他主机。 (2) Orchestrator编排器和插件 研究者在受害者计算机上的lsass.exe进程中发现了Orchestrator编排器恶意软件。该编排器恶意软件从注册表项加载加密的配置数据,并使用AES算法对其解密。除非注册表值存在,否则恶意软件会使用硬编码的配置数据。以下是来自一个编排器恶意软件样本的配置值示例: 编排器可以同时加载15个插件。有三种加载方式: 从指定的HTTP或HTTPS服务器下载插件 从指定的磁盘路径加载AES加密的插件文件 从当前的MataNet连接下载插件文件 2. 非Windows版本 MATA框架不仅针对Windows系统,而且针对Linux和macOS系统。Linux版本的MATA在合法的发行站点上可用,而macOS变体作为木马两步验证(2FA)应用程序提供。 (1) Linux版本 研究者发现了一个包含不同MATA文件和一套黑客工具的软件包。可以在合法的分发站点上找到该软件包,这可能表明这是分发恶意软件的方式。它包括Windows MATA编排器,用于列出文件夹的Linux工具,用于利用Atlassian Confluence Server(CVE-2019-3396)的脚本,合法的socat工具以及与一组插件捆绑在一起的MATA Orchestrator的Linux版本。中国安全厂商360的网络安全研究院发布过有关该恶意软件的详细博客(https://blog.netlab.360.com/dacls-the-dual-platform-rat-en/)。 (2) MacOS版本 研究人员还在2020年4月8日发现了一个上传到VirusTotal的攻击macOS的MATA恶意软件余本。恶意苹果硬盘镜像文件是一个基于开源双因子认证应用MinaOTP的木马化macOS应用。 木马化 macOS 应用 来源:卡巴斯基实验室 与其他跨平台恶意软件类似,macOS MATA恶意软件也以插件形式运行。插件列表与Linux版本几乎完全相同,但MacOS版本增加了一个名为“plugin_socks”的插件,该插件与“plugin_reverse_p2p” 类似,负责配置代理服务器。 (3) 幕后黑手 MATA的受害者地理分布 来源:卡巴斯基实验室 在研究报告中,卡巴斯基实验室将MATA恶意软件平台归因于著名的APT组织Lazarus: 我们评估了MATA框架与LazarusAPT组织之间的联系。MATA协调器使用两个唯一的文件名c_2910.cls和k_3872.cls,这些文件名以前仅在几种Manuscrypt变体中才能看到,包括在US-CERT出版物中提到的样本(0137f688436c468d43b3e50878ec1a1f)。 研究人员指出,由Lazarus发行的恶意软件家族Manuscrypt的变体与MATA共享了类似的配置结构。这意味着MATA与Lazarus很可能存在直接关联。卡巴斯基实验室表示,随着MATA恶意软件平台的发展,它将继续对其进行监控。 失陷指标 文件哈希(恶意文档、木马、电子邮件、诱饵) (1) Windows加载器 f364b46d8aafff67271d350b8271505a 85dcea03016df4880cebee9a70de0c02 1060702fe4e670eda8c0433c5966feee 7b068dfbea310962361abf4723332b3a 8e665562b9e187585a3f32923cc1f889 6cd06403f36ad20a3492060c9dc14d80 71d8b4c4411f7ffa89919a3251e6e5cb a7bda9b5c579254114fab05ec751918c e58cfbc6e0602681ff1841afadad4cc6 7e4e49d74b59cc9cc1471e33e50475d3 a93d1d5c2cb9c728fda3a5beaf0a0ffc 455997E42E20C8256A494FA5556F7333 7ead1fbba01a76467d63c4a216cf2902 7d80175ea344b1c849ead7ca5a82ac94 bf2765175d6fce7069cdb164603bd7dc b5d85cfaece7da5ed20d8eb2c9fa477c 6145fa69a6e42a0bf6a8f7c12005636b 2b8ff2a971555390b37f75cb07ae84bd 1e175231206cd7f80de4f6d86399c079 65632998063ff116417b04b65fdebdfb ab2a98d3564c6bf656b8347681ecc2be e3dee2d65512b99a362a1dbf6726ba9c fea3a39f97c00a6c8a589ff48bcc5a8c 2cd1f7f17153880fd80eba65b827d344 582b9801698c0c1614dbbae73c409efb a64b3278cc8f8b75e3c86b6a1faa6686 ca250f3c7a3098964a89d879333ac7c8 ed5458de272171feee479c355ab4a9f3 f0e87707fd0462162e1aecb6b4a53a89 f1ca9c730c8b5169fe095d385bac77e7 f50a0cd229b7bf57fcbd67ccfa8a5147 (2) Windows MATA bea49839390e4f1eb3cb38d0fcaf897erdata.dat 8910bdaaa6d3d40e9f60523d3a34f914 sdata.dat 6a066cf853fe51e3398ef773d016a4a8 228998f29864603fd4966cadd0be77fc (3) 注册表路径 HKLM\Software\Microsoft\KxtNet HKLM\Software\Microsoft\HlqNet HKLM\Software\mthjk (4) Linux MATA 859e7e9a11b37d355955f85b9a305fecmdata.dat 80c0efb9e129f7f9b05a783df6959812ldata.dat,mdata.dat d2f94e178c254669fb9656d5513356d2mdata.dat (5) Linux日志收集器 982bf527b9fe16205fea606d1beed7fahdata.dat (6) 开源Linux SoCat e883bf5fd22eb6237eb84d80bbcf2ac9sdata.dat (7) 利用Atlassian Confluence Server的脚本 a99b7ef095f44cf35453465c64f0c70ccheck.vm,r.vm 199b4c116ac14964e9646b2f27595156r.vm (8) macOS MATA 81f8f0526740b55fe484c42126cd8396TinkaOTP.dmg f05437d510287448325bac98a1378de1SubMenu.nib C2服务器地址 104.232.71.7:443 107.172.197.175:443 108.170.31.81:443 111.90.146.105:443 111.90.148.132:443 172.81.132.41:443 172.93.184.62:443 172.93.201.219:443 185.62.58.207:443 192.210.239.122:443 198.180.198.6:443 209.90.234.34:443 216.244.71.233:443 23.227.199.53:443 23.227.199.69:443 23.254.119.12:443 67.43.239.146:443 68.168.123.86:443 【本文是51CTO专栏作者“安全牛”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文 【责任编辑:赵宁宁TEL:(010)68476606】

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。