关于思否技术征文:技术征文中奖名单公布-丨浅谈-Go-语言框架

哈喽社区的小伙伴!SegmentFault 思否技术征文丨浅谈 Go 语言框架 流动开奖啦~ 话不多说,咱们间接来揭晓获奖名单! 插播一条预报:年度有奖征文马上也要来咯,欢送大家多多关注「SegmentFault思否」参加征文活动。获奖名单Tips:一位作者多篇文章参加,最终会以多篇文章中综合评估最高的为准 # 优良文章奖 #基于评判规范,参加流动 1-10 名的创作者,均可取得一本技术书籍《Go 语言设计与实现》。# 名单 #文章作者【Go 微服务】开发 gRPC 总共分三步王中阳Go前端如何入门 Go 语言robinGo 十年了,终于想起要对立 log 库了!煎鱼三分钟学会 Go 语言的变量定义夕水Go入门系列:你好,世界似水流年在 Golang 中依赖注入是 解药 还是 毒药?LinkinStarGo 语言与数据库 — GORM 入门良猿Go 语言如何连贯并操作 MySQL 数据库宇宙之一粟Gin + GORM 入门到实战程序员海军Golang Copier 入门到入坑小白要生发# 参加文章汇总 #所有参加文章可点击这里查看:「思否技术征文」 欢送大家浏览~ 如何支付奖品请各位获奖的小伙伴在 2022 年 12 月 4 日 之前,将收货信息填写至以下表格,逾期则视为主动放弃。 表单:https://jinshuju.net/f/ejCv1G 因疫情起因,目前无奈发货,快递通了会马上给中奖的小伙伴们发货哒,如有问题能够增加小姐姐微信~ 近期 SegmentFault 思否团队正式对外开源问答社区软件 Answer;其后端也是应用 Go 语言实现。 期待每一位开发者的参加和奉献,如果你对咱们的产品设计与社区倒退有任何想法和倡议,都能够在 GitHub 上找到咱们,独特建设 Answer 社区。 Answer 不仅领有搭建问答平台(Q&A Platform)的根底性能,还在产品设计上融入了开发团队对社区倒退的思考,并将其教训产品化,退出了标签内容治理、徽章与声望值体系等性能。 ...

November 28, 2022 · 1 min · jiezi

关于思否技术征文:Go-函数注意事项

细节汇总函数的形参列表能够是多个,返回值列表也能够是多个形参列表和返回值列表的数据类型,能够是值类型、也能够是援用类型函数的命名遵循标识符命名标准,首字母不能是数字,首字母大写示意该函数能够被本包文件和其它文件应用,相似public;首字母小写只能被本包文件应用,相似private。函数中的变量是部分的,内部不能拜访。作用域根本数据类型和数组都是值传递的,即进行值拷贝。在函数内批改,不会影响到原来的值,如果心愿函数内的变量可能批改函数外的变量,能够传入变量的地址(&),函数内以指针的形式操作变量,从成果上看相似援用Go函数不反对函数重载。在Go中,函数也是一种数据类型,能够赋值给一个变量,则该变量是一个函数类型的变量,通过该变量能够对函数调用。函数既然是一种数据类型,因而在Go中,函数也能够作为形参,并且调用。(回调函数)为了简化数据类型定义,Go反对自定义数据类型 语法: type 自定数据类型名 数据类型 (相当于一个别名)案例: type myInt int 这时,myInt就等价于int来应用了type mySum func(int, int) int 这时,mySum就等价于func(int, int) int反对对函数返回值命名(能够不受返回值程序限度)应用 _ 下划线标识符,疏忽返回值。(占位符)Go反对可变参数值传递和指针传递func test(n1 int) { n1 = n1 + 10 fmt.Println("test n1=", n1)}// 指针类型接管解决func test02(n2 *int) { *n2 = *n2 + 10 fmt.Println("test02 n2=", *n2)}func main() { n1 := 20 n2 := 2 test(n1) // 值类型 test02(&n2) // 指针类型 fmt.Println("main n1=", n1) fmt.Println("main n2=", n2)}什么是重载重载: 函数名雷同,然而形参不同或者数据类型不同的状况。 Golang语言中是不反对传统的函数重载的,fn redeclared in this block Golang语言是反对可变参数的,空接口的模式 ...

November 24, 2022 · 2 min · jiezi

关于思否技术征文:动图图解怎么让goroutine跑一半就退出

本文参加了思否技术征文,欢送正在浏览的你也退出。 光看题目,大家可能不太了解我说的是啥。 咱们平时创立一个协程,跑一段逻辑,代码大略长这样。 package mainimport ( "fmt" "time")func Foo() { fmt.Println("打印1") defer fmt.Println("打印2") fmt.Println("打印3")}func main() { go Foo() fmt.Println("打印4") time.Sleep(1000*time.Second)}// 这段代码,失常运行会有上面的后果打印4打印1打印3打印2留神这下面"打印2"是在defer中的,所以会在函数完结前打印。因而后置于"打印3"。 那么明天的问题是,如何让Foo()函数跑一半就完结,比如说跑到打印2,就退出协程。输入如下后果 打印4打印1打印2也不卖关子了,我这边间接说答案。 在"打印2"前面插入一个 runtime.Goexit(), 协程就会间接完结。并且完结前还能执行到defer里的打印2。 package mainimport ( "fmt" "runtime" "time")func Foo() { fmt.Println("打印1") defer fmt.Println("打印2") runtime.Goexit() // 退出这行 fmt.Println("打印3")}func main() { go Foo() fmt.Println("打印4") time.Sleep(1000*time.Second)}// 输入后果打印4打印1打印2能够看到打印3这一行没呈现了,协程的确提前结束了。 其实面试题到这里就讲完了,这一波自问自答可还行? 但这不是明天的重点,咱们须要搞搞分明外部的逻辑。 runtime.Goexit()是什么?看一下外部实现。 func Goexit() { // 以下函数省略一些逻辑... gp := getg() for { // 获取defer并执行 d := gp._defer reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz)) } goexit1()}func goexit1() { mcall(goexit0)}从代码上看,runtime.Goexit()会先执行一下defer里的办法,这里就解释了结尾的代码里为什么在defer里的打印2能失常输入。 ...

November 23, 2022 · 2 min · jiezi

关于思否技术征文:在-Golang-中依赖注入是-解药-还是-毒药

前言看到题目,有人可能会纳闷,其实起因是当我在网络上搜寻无关 golang 依赖注入、 wire 这些关键词的时候,有一些评论是上面这样的: 有人认为 依赖注入 不应该呈现在 golang 中,是毒药而也有人认为 依赖注入 是十分好的设计思路,是依赖治理的解药在通过不少我的项目的磨砺,笔者也终于对依赖注入有了新的意识,但这几个月始终在折腾和纠结,到底要不要写本文。网络上早就曾经有了各种探讨有对于 Golang 是否须要 依赖注入 的呼声。明天,我还是感觉将它换一个角度,作为一个集体的小总结和感悟将它记录下来。 故,本文倡议举荐给下述人群: 还在纠结 golang 要不要应用依赖注入的人对 依赖注入 了解还有所纳闷的人为了简述,下文有以下简称依赖注入 简称为:DI面向对象 简称为:OOP个人观点我不喜爱浪费时间,也防止题目党嫌疑,所以为了节约工夫,对于曾经晓得 DI 概念的敌人,间接先给出我本人的观点: 如果你当初做的我的项目不大,或是集体我的项目,并且还在尝试阶段。齐全的面向过程编程,在 go 中是可行的。但如果你的我的项目比拟大,又是多人合作,我真心倡议你应用 DI,OOP 是有它存在的意义的。如果你没接触过 DI,那么你肯定要尝试去了解它一次,至多给他一次机会,不要自觉听取网络上的声音,实际是测验真谛的唯一标准。或者听下来,我这个观点如同有点矛盾,如果你违心,请服从我一个过来人,上面几个方面去论述一下。 为什么我说是过来人呢? 因为我一开始也是应用的 java 做了很久,spring 也是 YYDS,而后转而到 golang 并且一开始也没有应用依赖注入,而后缓缓在学习过程中有了转变,心愿从这个门路能给你一些思路Golang 齐全面向过程编程可行吗?可行!十分明确的通知你。我之前有幸参加过前公司一个比拟大型的开发我的项目,因为那个时候刚接触 golang,过后大家都还比拟生疏,还在摸索的阶段,过后就是齐全应用了面向过程的形式去编程。我的项目自身蕴含前端和后盾,有 WEB,也有业务,也有各种 SDK 和接口。或者你还对面向过程的形式不太了解,我举几个具体代码例子: service.GetUserByID(userID)dao.GetUserByID(userID)db.Engine.Find()你是否有相熟的感觉呢?如果有,那可能你和咱们过后差不多。过后所有的函数都是间接应用包名调用的,不须要初始化,也不须要 new 对象,function 内容 就是 过程。 也有几个不言而喻的特色: 初始化全副都在 main 外面实现,包含日志、数据库、缓存等等...办法的调用都是间接 包名+办法名相干依赖中间件的调用(数据库引擎、缓存实例等)全副都走的是全局变量,一次初始化,轻易哪里都能用PS:其实,当初这个我的项目还有一个 1.0 的版本,在 1.0 的版本中尽管没有应用DI,然而过后是 OOP 的思维在做的,咱们过后的开发也统一感觉麻烦,所以没有采纳。整个我的项目当初都还在失常运行,除了 bug 没有问题。 开发实现的感触疾速好了解无扩大整个我的项目从头至尾咱们就没有定义过几个 interface 去实现,并且咱们当初感觉良好,甚至多拿了点奖金,哈哈。没有意识到任何问题。直到我一直的做我的项目,换了公司才发现,原来挖坑了。 ...

November 19, 2022 · 3 min · jiezi

关于思否技术征文:Go微服务开发gRPC总共分三步

前言上一篇文章咱们介绍了ProtoBuf的应用,不理解ProtoBuf的同学倡议先读这篇文章:# 一文带你玩转ProtoBuf,会用protobuf是学习gRPC的根底。 之前我也有写过RPC相干的文章:《 Go RPC入门指南:RPC的应用边界在哪里?如何实现跨语言调用?》,具体介绍了RPC是什么,应用边界在哪里?并且用Go和php举例,实现了跨语言调用。不理解RPC的同学倡议先读这篇文章补补课。 下面提到的这些基础知识,不作为本文的重点。 这篇文章将重点介绍在微服务中gRPC的应用: 开发流程在微服务分布式架构中开发gRPC其实非常简单,不要畏难畏烦,没有什么心智累赘的。 开发gRPC的流程和宋丹丹把大象装冰箱是一样的: 把冰箱门关上把大象装进去把冰箱门关上开发gRPC的流程; 写proto文件定义服务和音讯应用protoc工具生成代码编写业务逻辑代码提供服务就是这么简略。 上面我依然以Go语言举例,其余语言的实现思路也是一样的。 入门实际为了让大家更好了解,我参考gRPC官网文档,写了一个helloword示例。 下图是应用Go实现gRPC开发的目录结构图,先让大家有个整体的意识: 欢送大家依照我的步骤进行复刻实际: 看文章是学不会编程的,然而一边看文章一边敲代码能够! 1. 写proto文件定义服务和音讯service Greeter {} 是咱们定义的服务 rpc SayHello (HelloRequest) returns (HelloReply) {} 是在服务中定义的办法 protoc工具集,会依据咱们定义的服务、办法、和音讯生成指定语言的代码。 syntax = "proto3";option go_package = "./;hello";package hello;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}}message HelloRequest {string name = 1;}message HelloReply {string message = 1;}如果小伙伴们看下面代码有不懂的中央,那就是protobuf根底不牢了,请看这篇:一文带你玩转protobuf,回顾一下知识点。 2. 应用protoc工具生成代码切换到proto文件所在目录下 cd protos/helloword/生成Go代码 protoc --go_out=. helloworld.proto小技巧之同步依赖:当你生成Go代码后,发现生成的文件飘红报错,不要缓和,少数状况是因为依赖不存在导致的。执行上面的命令,同步依赖就能够了: go mod tidy 3. 编写业务逻辑代码 提供服务上面是明天的重点,咱们用Go实现业务逻辑的编写,留神看: 在微服务架构开发gRPC时,肯定有两个端:服务端和客户端。 咱们的习惯是,在搞定protobuf之后,先写服务端逻辑,裸露端口,提供服务;再写客户端逻辑,连贯服务,发送申请,解决响应。 ...

November 16, 2022 · 3 min · jiezi

关于思否技术征文:go语言web开发框架gin框架入门

疾速入门装置并配置GO工作区在GOPATH的src目录下新建我的项目文件夹应用 go mod init命令初始化我的项目应用go get -u github.com/gin-gonic/gin命令装置gin示例代码:package mainimport "github.com/gin-gonic/gin"func main() { // 创立默认路由 r := gin.Default() // 绑定路由规定和执行函数,当拜访/ping接口时就会执行前面的函数 r.GET("/ping", func(c *gin.Context) { // 该函数间接返回JSON字符串 c.JSON(200, gin.H{ "message": "pong", }) }) // 启动并监听端口,默认8080,可应用:r.Run(":8000")批改监听端口 r.Run()}浏览器或postman拜访:localhost:8080/ping,即可胜利返回json字符串路由API参数在门路中应用/:paramName或者/*paramName作为占位符,可在代码中通过*gin.Context的param办法获取到API参数,应用冒号占位符获取到的API参数不蕴含门路中的/,应用星号占位符则蕴含/ func main() { // 创立路由 r := gin.Default() r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") c.JSON(http.StatusOK, gin.H{ "name":name, "action":action, }) }) // 默认端口号是8080 r.Run(":8000")}应用postman申请http://127.0.0.1:8000/user/lee/index.html,返回的json格局如下: { "action": "/index.html", "name": "lee"}URL参数应用DefaultQuery或者Query办法能够获取前端传递的URL参数 DefaultQuery:可指定默认值 Query:不可指定默认值 func main() { // 创立路由 r := gin.Default() r.GET("/add_user", func(c *gin.Context) { name := c.Query("name") age := c.DefaultQuery("age", "23") c.JSON(http.StatusOK, gin.H{ "name":name, "age":age, }) }) // 默认端口号是8080 r.Run(":8000")}postman拜访:http://127.0.0.1:8000/add_user?name=lee&age=18,返回如下: ...

November 9, 2022 · 5 min · jiezi

关于思否技术征文:Go微服务一文带你玩转ProtoBuf

前言在网络通信和通用数据交换等利用场景中常常应用的技术是 JSON 或 XML,在微服务架构中通常应用另外一个数据交换的协定的工具ProtoBuf。 ProtoBuf也是咱们做微服务开发,进行Go进阶实战中,必知必会的晓得点。 明天就开始第一章内容:《一文带你玩转ProtoBuf》 5分钟入门1.1 简介你可能不晓得ProtoBuf,但肯定晓得json或者xml,从肯定意义上来说他们的作用是一样的。 ProtoBuf全称:protocol buffers,直译过去是:“协定缓冲区”,是一种与语言无关、与平台无关的可扩大机制,用于序列化结构化数据。 和json\xml最大的区别是:json\xml都是基于文本格式,ProtoBuf是二进制格局。 ProtoBuf相比于json\XML,更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简略。 咱们只须要定义一次数据结构,就能够应用ProtoBuf生成源代码,轻松搞定在各种数据流和各种语言中写入、读取结构化数据。 1.2 装置倡议大家应用支流版本v3,这是官网下载地址:https://github.com/protocolbu... 留神,不同的电脑系统安装包是不一样的: Windows 64位 点这里下载Windows 32位 点这里下载Mac Intel 64位 点这里下载Mac ARM 64位 点这里下载Linux 64位 点这里下载小技巧:Mac查看本人的芯片类型点击左上角的苹果图标,再点击对于本机,就能够查看了。 比方,我的处理器芯片是intel的,下载安装包之后是这样的: bin目录下的protoc是ProtoBuf的工具集,下文会重点介绍它的应用。 留神:咱们须要将下载失去的可执行文件protoc所在的 bin 目录加到咱们电脑的环境变量中。 Mac装置小技巧如果你的Mac装置了brew,装置ProtoBuf就更简略了,咱们应用brew install ProtoBuf就能够了 1.3 编译go语言的工具包这个protoc能够将proto文件编译为任何语言的文件,想要编译为go语言的,还须要下载另外一个可执行文件 命令是这样的: go install google.golang.org/ProtoBuf/cmd/[email protected]或者 go get github.com/golang/protobuf/protoc-gen-go1.4 编写proto代码上面就编写一个非常简单,然而五脏齐全的proto代码,咱们再依据这段代码生成pb.go文件。 syntax = "proto3";package hello;option go_package = "./;hello";message Say{ int64 id = 1; string hello = 2; repeated string word = 3;}1.5 生成go代码生成go代码,非常简单,应用上面的命令就能够了。 ...

November 8, 2022 · 3 min · jiezi

关于思否技术征文:Go-函数包的使用

本文通过一个实现加减乘除运算的小程序来介绍go函数的应用,以及应用函数的注意事项,并引出了对包的理解和应用。实现加减乘除运算传统办法实现: var n1 float64 = 1.2var n2 float64 = 2.1var opt byte = '+'var res float64switch opt { case '+': res = n1 + n2 case '-': res = n1 - n2 case '*': res = n1 * n2 case '/': res = n1 / n2 default: fmt.Println("不非法的运算符")}fmt.Printf("res=%v", res)以上代码的问题: 需要变更,取模,代码不够灵便不利于保护代码冗余函数能够解决这个问题 封装传参调用返回值函数根本语法func 函数名 (形参列表) (返回值列表) { 执行语句 return 返回值列表 } 下面代码改写: func calc(n1 float64, n2 float64, opt byte) float64 { var res float64 switch opt { case '+': res = n1 + n2 case '-': res = n1 - n2 case '*': res = n1 * n2 case '/': res = n1 / n2 default: fmt.Println("不非法的运算符") } return res}func main() { fmt.Println("hello fn") var n1 float64 = 1.2 var n2 float64 = 2.1 var opt byte = '+' var result float64 = calc(n1, n2, opt) fmt.Printf("%T %v \n", result, result)}函数的问题一个文件里呈现超级多的函数 ...

November 7, 2022 · 2 min · jiezi

关于思否技术征文:SegmentFault-思否技术征文丨浅谈-Go-语言框架

敬爱的开发者们: 咱们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢送大家来参加分享~ 征文工夫11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前公布中奖名单参加条件新老思否作者均可加入 征文要求一、内容规定: 本次征文以「Go」 为主题,分享你在 Go 方面的实战经验,内容波及 Go 框架或蕴含框架相干内容即可。 写作方向参考:Go 语言框架根底 Go 语言常见的框架 Go 语言微服务开发框架 Go 语言日志框架 基于 Golang 开发框架实战 Go Web 轻量级框架 Golang 后盾麻利开发框架 Go 语言主题相干 ...... 文章要求原创,内容合乎思否社区的内容规范和标准, 字数不得少于 500 字,不得有打广告、加二维码引流和凑字数行为。文章不能只贴代码,要有本人的剖析思考,否则不计入如果发现参加流动的文章是非原创文章,会勾销该作者获奖资格。 注:全文超过 50% 与别人创作的内容反复都视为非原创(包含间接 剽窃转载 、大篇幅摘抄书籍、网络文章、产品官网文档等)。二、书写规定: 增加「思否技术征文」和「go」标签(是加两个标签哦)并在文章中增加小尾巴:本文参加了「思否技术征文」,欢送正在浏览的你也退出应用 Markdown 编辑器 的小伙伴们能够间接复制以下内容到文章后 本文参加了[思否技术征文](https://segmentfault.com/a/1190000042741155),欢送正在浏览的你也退出。评比形式依据文章品质、文章字数、文章浏览量、互动数据(点赞、评论、珍藏)、互动品质(评论是否是与文章内容相干的探讨等)等综合评估征文期间,经营同学会核查每篇文章,查看是否有刷量等违规行为,如存在违规行为勾销流动的获奖资格征文处分获奖规定均基于评比形式1-10 名的创作者,均可取得一本技术书籍《Go 语言设计与实现》参加征文并录入的优良文章,优先取得「思否首页举荐」一次,更有机会取得思否官网微博、微信公众号等渠道举荐,让更多用户能够看到你的文章。舒适提醒: 公布后在此帖上面留言,小姐姐会更快发现你的文章,获奖机会更大。记得肯定要 +标签,+注明超链接一位作者多篇文章参加,最终会以多篇文章中综合评估最高的为准 其实近期 SegmentFault 思否团队正式对外开源问答社区软件 Answer;其后端也是应用 Go 语言实现。 ...

November 4, 2022 · 1 min · jiezi

关于思否技术征文:技术征文中奖名单公布-|-浅谈-Java-进阶之路

哈喽各位社区的小伙伴!SegmentFault 思否技术征文丨浅谈 Java 进阶之路 如约开奖啦~ 话不多说,咱们间接来揭晓获奖名单! 强势插播一条预报:技术征文活动每月都有哦,大家多多关注「SegmentFault思否」参加技术征文,支付限量周边。获奖名单Tips:一位作者多篇文章参加,最终会以多篇文章中综合评估最高的为准 # 优良文章奖 #基于评判规范,选取 10 位小伙伴随机送出 技术书籍「Java核心技术 卷I:开发根底」or 思否猫手办。同时优秀奖的文章,都将取得「思否首页举荐」一次,更有机会取得思否官网微博、微信公众号等渠道举荐。# 名单 #作者文章why技术写个续集,填坑来了!对于“Thread.sleep(0)这一行‘看似无用’的代码”外面留下的坑。宁在春Java反射真正的详解,学以致用,实战案例,虽不迭万字,但也已有近8000字三掌柜Java开发:实现用户注册登录的性能小奇Java面试面试官:建造者模式是什么?zxdposter微服务开发系列:开篇若尘大话 Java 异样六七十三Spring Boot Reactor 整合 Resilience4j程序员海军从前端到全栈 -- 最全面向对象总结咕咕鸡Java 并发编程生产利用场景及实战缓和的羊肉串aa大厂钟爱的全链路压测有什么意义?四种压测计划具体比照剖析# 阳光普照奖 #参加征文活动并被录入的文章作者,均可取得思否定制鼠标垫# 名单 #作者文章尚影嫣音讯队列的流派江南一点雨手把手教大家编译 flowable 源码程序员田同学设计模式之中介者模式宇宙之一粟一文带你理解 Java 中的结构器奖品概览图:思否猫手办 / 思否定制鼠标垫(40cm x 90cm x 0.3cm) / 技术书籍「Java核心技术 卷I:开发根底」 如何支付奖品请各位获奖的小伙伴在 2022年9月26日 之前,将收货信息填写至以下表格,逾期则视为主动放弃哦,奖品将于表单截止日期后的 7 个工作日内发放,如疫情地区若无奈接管快递,发货工夫会适当延后 表单:https://jinshuju.net/f/ArEV6f 参加文章汇总以下是参加文章汇总,欢送大家浏览~ 音讯队列的流派 作者:尚影嫣kafka的主题和分区 作者:尚影嫣Kafka集群及正本的概念 作者:尚影嫣写个续集,填坑来了!对于“Thread.sleep(0)这一行‘看似无用’的代码”外面留下的坑。 作者:why技术Java 并发编程生产利用场景及实战 作者:咕咕鸡大厂钟爱的全链路压测有什么意义?四种压测计划具体比照剖析 作者:缓和的羊肉串aa【手把手】光说不练假把式,这篇全链路压测实际摸索 作者:缓和的羊肉串aa【代码级】全链路压测的整体架构设计,以及5种实现计划 作者:缓和的羊肉串aa设计模式之中介者模式 作者:程序员田同学手把手教大家编译 flowable 源码 作者:江南一点雨手把手教大家在 Spring Boot 中解决 flowable 中的用户和组! 作者:江南一点雨面试官:建造者模式是什么? 作者:小奇Java面试面试官:设计模式中的原型模式是什么? 作者:小奇Java面试面试官:设计模式中的单例模式是什么? 作者:小奇Java面试Java开发:实现用户注册登录的性能 作者:三掌柜Java开发必学常识合集(一) 作者:三掌柜大话 Java 异样 作者:若尘Javaweb 自定义 Servlet 实现依照拜访门路转发 作者:若尘几行代码带你彻底搞懂 Java 外部类 作者:若尘Java反射真正的详解,学以致用,实战案例,虽不迭万字,但也已有近8000字 作者:宁在春一文带你理解 Java 中的结构器 作者:宇宙之一粟Spring Boot Reactor 整合 Resilience4j 作者:六七十三微服务开发系列:开篇 作者:zxdposter微服务开发系列:为什么抉择 kotlin 作者:zxdposter微服务开发系列:为什么用 gradle 构建 作者:zxdposter微服务开发系列:目录构造,放弃整洁的文件环境 作者:zxdposter微服务开发系列:如何打印好日志 作者:zxdposter微服务开发系列:意识到序列化的重要性 作者:zxdposter微服务开发系列:利用异样个性,把异样纳入框架治理之中 作者:zxdposterDisruptor测试后果运算1亿次,耗时5503ms,吞吐量18171000/s,于是我扒开了Disruptor高性能的外衣 作者:缓和的羊肉串aaCI/CD和 DevOps还在傻傻分不清吗?今日一文让你通透 作者:缓和的羊肉串aa如此狂妄,自称高性能队列的Disruptor有啥来头? 作者:缓和的羊肉串aa从前端到全栈 -- 最全面向对象总结 作者:程序员海军Disruptor生产和生产模式详解及高级利用(并行模式) 作者:缓和的羊肉串aa如有问题能够增加小姐姐微信~ ...

September 22, 2022 · 1 min · jiezi

关于思否技术征文:从前端到全栈-最全面向对象总结

本文参加了思否技术征文,欢送正在浏览的你也退出。从事前端的这两年中,也接触了后端畛域,像 PHP Node, 并且都用它们做过一些 demo 和 私活 ,站在职业倒退路线上来讲,理解后端是好的,本人能够纯熟前后的开发流程,整条链路下来,很清晰,懂了后端,在本人当前守业或者接私活,都是不错的。 而且当初在Web后盾畛域, Java 是 老大哥了,Spring 全家桶走遍天下,于是最近又重拾 Java 了,从前端迈向全栈 这是我最近花了一周的工夫复盘的 Java 面向对象 总结,心愿能帮忙到你. 导读目录 学习路线这份学习路线 是 我跟着 某up主 视频总结的,很全面 重学Java一、面向对象 OOP1. 1 对于 super 和 this 区别supersuper 调用父类的构造方法,必须在子类构造方法中第一个super 必须只能呈现在子类的办法 或者 构造方法 中super 和 this 不能同时呈现在调用构造方法this代表的对象不同: this : 自身调用者这个对象super : 代表父类对象利用1.2 多态同一办法能够依据发送对象的不同而采纳多种不同的行为形式。 一个对象的理论类型是确定的,但能够指向对象的援用类型有很多。 多态存在条件 有继承关系子类重写父类的办法父类援用指向了子类对象留神 子类如果重写了父类办法,父类对象是调用的子类重写后的办法类型转换类型转换目标: 不便办法调用,降级,降级,缩小代码重复性,但也有毛病,失落精度性 向上转型 (子 转 父 ) 低转高 可间接转向下转型 (父 转 子) 高转低 须要强制转换 高 转 低 后, 而后再进行强制转换, ...

September 20, 2022 · 2 min · jiezi

关于思否技术征文:Spring-Boot-Reactor-整合-Resilience4j

Reactor 整合 Resilence4j 1 引入 pom 包<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-all</artifactId></dependency><dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId></dependency>2 配置阐明2.1 限流 ratelimiter两个限流配置:backendA 1s 中最多容许 10 次申请; backendB 每 500ms 最多容许 6 次申请。 resilience4j.ratelimiter: instances: backendA: limitForPeriod: 10 limitRefreshPeriod: 1s timeoutDuration: 10ms registerHealthIndicator: true eventConsumerBufferSize: 100 backendB: limitForPeriod: 6 limitRefreshPeriod: 500ms timeoutDuration: 3s配置属性默认值形容timeoutDuration5【s】一个线程期待许可的默认等待时间limitRefreshPeriod500【ns】限度刷新的周期。在每个周期之后,速率限制器将其权限计数设置回 limitForPeriod 值limitForPeriod50一个 limitRefreshPeriod (周期)容许拜访的数量(许可数量)2.2 重试 retry留神指定须要重试的异样,不是所有的异样重试都无效。比方 DB 相干校验异样,如惟一束缚等,重试也不会胜利的。 重试配置: resilience4j.retry: instances: backendA: maxAttempts: 3 waitDuration: 10s enableExponentialBackoff: true exponentialBackoffMultiplier: 2 retryExceptions: - org.springframework.web.client.HttpServerErrorException - java.io.IOException backendB: maxAttempts: 3 waitDuration: 10s retryExceptions: - org.springframework.web.client.HttpServerErrorException - java.io.IOException配置属性默认值形容maxAttempts3最大重试次数(包含第一次)waitDuration500【ms】两次重试之间的期待距离intervalFunctionnumOfAttempts -> waitDuration批改失败后期待距离的函数。默认状况下,等待时间是个常量。retryOnResultPredicateresult->false配置一个判断后果是否应该重试的 predicate 函数。如果后果应该重试,Predicate 必须返回 true,否则它必须返回 false。retryExceptionPredicatethrowable -> true和 retryOnResultPredicate 相似,如果要重试,Predicate 必须返回true,否则返回 false。retryExceptions空须要重试的异样类型列表ignoreExceptions空不须要重试的异样类型列表failAfterMaxAttemptsfalse当重试达到配置的 maxAttempts 并且后果仍未通过 retryOnResultPredicate 时启用或禁用抛出 MaxRetriesExceededException 的布尔值intervalBiFunction(numOfAttempts, Either<throwable, result>) -> waitDuration依据 maxAttempts 和后果或异样批改失败后期待间隔时间的函数。与 intervalFunction 一起应用时会抛出 IllegalStateException。2.3 超时 TimeLimiter超时配置: ...

September 20, 2022 · 2 min · jiezi

关于思否技术征文:一文带你了解-Java-中的构造器

C ++ 引入了结构器(constructor,也叫构造函数)的概念,它是在创建对象时被主动调用的非凡办法。 Java 也采纳了结构器,并且还提供了一个垃圾收集器(garbage collector),当不再应用内存资源的时候,垃圾收集器会主动将其开释。 结构器定义在 Java 中,能够通过编写结构器来确保每个对象的初始化。然而这里有两个问题: 这个结构器应用的任何名字都有可能与类里某个成员相冲突;编译器负责调用结构器,所以它必须始终晓得应该调用哪个办法。C++ 语言采纳的计划就是将结构器和类的名字定义雷同,Java 也采纳了这个计划。 结构器的作用是用来建设一个新的类的实例,当一个对象被创立时,JVM 应用一个构造函数,并为其分配内存空间。 语法结构class ClassName { ClassName() { }}例如,在上面的示例中,咱们创立了一个名为 ReLearnConstructor 的构造函数。在构造函数外部,咱们正在初始化 hello 变量的值。: public class ReLearnConstructor { String hello; // 属性 // 结构器 public ReLearnConstructor() { hello = "Hello, Constructor!"; } public static void main(String[] args) { ReLearnConstructor rc = new ReLearnConstructor(); System.out.println(rc.hello); }}留神创立 ReLearnConstructor 类的对象的语句:ReLearnConstructor rc = new ReLearnConstructor(); 在这里,当创建对象时,调用 ReLearnConstructor 构造函数。并且,hello 变量的值被初始化。 因而打印的 hello 的值为: ...

September 19, 2022 · 3 min · jiezi

关于思否技术征文:手把手教大家在-Spring-Boot-中处理-flowable-中的用户和组

@[toc]尽管说咱们在理论开发中,很少会间接用到 flowable 中的用户体系,然而,也不太可能齐全用不到,毕竟官网设计了这个货色,而存在就必然有其合理性,所以,明天松哥还是来和大家聊一聊,在 Spring Boot 我的项目中,咱们如何去增加、删除、批改一个用户或者组。 1. 筹备工作首先咱们创立一个 Spring Boot 我的项目,引入 Web 依赖和 MySQL 驱动,如下: 创立实现之后,咱们再手动退出 flowable 依赖,如下: <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.7.2</version></dependency>而后在 properties 文件中配置一下数据库连贯信息就行了: spring.datasource.username=rootspring.datasource.password=123spring.datasource.url=jdbc:mysql:///flowable-idm?serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true好了,筹备工作就算实现了。 2. 用户操作在 Spring Boot 中,flowable 默认曾经给咱们配置好了 IdentityService 对象,咱们只须要将之注入到我的项目中就能够应用了。 来看几个例子。 2.1 增加用户@AutowiredIdentityService identityService;@Testvoid contextLoads() { UserEntityImpl user = new UserEntityImpl(); user.setId("javaboy"); user.setDisplayName("江南一点雨"); user.setPassword("123"); user.setFirstName("java"); user.setLastName("boy"); user.setEmail("javaboy@qq.com"); user.setRevision(0); identityService.saveUser(user);}这些字段都很好了解,跟松哥之前说的在网页上增加用户的字段都差不多,须要留神的是 revision 的值为 0 示意这是一个新增加的用户。 增加之后,咱们在数据库的 ACT_ID_USER 表中,就能够看到刚刚退出的数据了: 2.2 批改用户如果是批改用户明码,能够调用如下办法: @Testvoid test02() { UserEntityImpl user = new UserEntityImpl(); user.setId("javaboy"); user.setPassword("666"); user.setRevision(1); identityService.updateUserPassword(user);}尽管这个办法名是 updateUserPassword,然而实际上这个也能批改其余属性。 ...

September 19, 2022 · 2 min · jiezi

关于思否技术征文:JavaWeb-项目服务器部署详细教程MySQL-JDK-Tomcat

本文参加了思否技术征文,欢送正在浏览的你也退出。JavaWeb 我的项目部署到服务器我这里的环境是 JDK13 + tomcat8.5.601. IDEA 打包我的项目右击我的项目点击 Open Module Settings构建筹备正式构建抉择方才构建的,点击 build 即可本地就能够看到打包好的war包 war包理论就是自压缩文件,相当于jar,服务器的tomcat会解析war文件为工程项目 2. 服务器资源筹备2.1 MySQL2.2 JDK下载地址:http://www.oracle.com/technet...2.3 tomcat下载地址:https://tomcat.apache.org/dow... 我这里应用的是v8.5.60,须要可自行下载链接:https://pan.baidu.com/s/1_mWn... 提取码:vyn7下载实现后将其搁置到服务器,这个大家都会,不加赘述解压到 usr/localtar -zxvf apache-tomcat-8.5.60.tar.gz -C /usr/local/装置好当前,在bin 目录下运行startup.sh文件查看一下 这里我换了台服务器,之前用的天翼云,然而tomcat开启后浏览器怎么都拜访不到,百度各种解决办法都没用(大家也有用天翼云的能够告我一下怎么搞得),只能用阿里云的,同样的配置,平安组端口也开了,就能拜访到,莫名其妙。。。。 而后在本地浏览器输出 http://ip:8080 试试能不能拜访到,如果能,祝贺你配置胜利,不能的话检查一下Java环境变量是否配置正确,防火墙是否敞开(或者凋谢8080端口),最重要的<font color="red">服务器的平安组中要配置8080端口</font>。呈现如下界面阐明配置胜利 如果想通过service启动或敞开tomcat能够进行如下配置 编辑 /etc/profile 文件进行tomcat环境变量配置 CATALINA_HOME=/usr/local/apache-tomcat-8.5.60export CATALINA_HOME source一下:source /etc/profile进入tomcat/bin, 批改 catalina.sh 增加代码如下CATALINA_HOME=/usr/local/apache-tomcat-8.5.60JAVA_HOME=/usr/local/java/jdk-13.0.1 执行上面语句:`cp catalina.sh /etc/init.d/tomcat`3. 上传war包通过传输工具将我的项目war包搁置到 webapps 目录下即可,这样就能够拜访了,如果想通过IP间接拜访我的项目请持续往下看4. IP/域名 间接拜访我的项目把tomcat默认的8080端口改为80端口 域名/IP绑定在HOST节点最上面增加以下代码`<Context path="" docBase="/usr/local/apache-tomcat-8.5.60/webapps/dormitory_manage_war" debug="0" reloadable="true" />`重启 tomcat,而后就能够间接应用ip/域名进行拜访

September 17, 2022 · 1 min · jiezi

关于思否技术征文:几行代码带你彻底搞懂Java内部类

本文参加了思否技术征文,欢送正在浏览的你也退出。外部类根本概述当一个类的定义放在另一个类的实体时,则该类叫做外部类,该类所在的类叫做外部类在一个类体中能够呈现的内容:成员变量、成员办法、构造方法、结构块、动态语句块、动态变量、办法、外部类嵌套类 外部类(成员外部类、部分外部类、匿名外部类)动态嵌套类语法格局class 外部类类名{ class 外部类类名{ 外部类类体; }}成员外部类成员外部类定义在另一个类或接口中的外部类注意事项 必须先创立外部类对象能力创立成员外部类对象不能含有动态变量、动态代码块、静态方法(除了动态常量)外部类能够通过成员外部类的对象调用外部类公有成员成员外部类是一个独立的类,编译成独立的.class文件作用 成员外部类既能够拜访外部类信息,又能够拜访父类信息,从而使得多继承的解决方案变得残缺案例 Outer.java // 成员外部类的应用public class Outer { // 外部类private String str = "Outer类的str1";private String str2 = "Outer类的str2";/* * 第一:外部类的名称不能与外部类重名 * 第二:能够应用final、拜访修饰符润饰 */public class Inner{ // 外部类 private String str = "Inner类的str1"; private String str2 = "Inner类的str2"; public void show() { // 外部类的成员优先于外部类成员 System.out.println(str); System.out.println(str2); // 应用"外部类.this.成员"拜访外部类的成员 System.out.println(Outer.this.str2); System.out.println(Outer.this.str); } }}TestOuter.java import Inner.demo1.Outer.Inner;public class TestOuter {public static void main(String[] args) { // 如果要创立外部类,那么在此之前须要先创立外部类对象 // 创立外部类对象 Outer o = new Outer(); // 创立外部类 Inner inner = o.new Inner(); inner.show(); }}Inner类的str1 Inner类的str2 Outer类的str2 Outer类的str1 ...

September 17, 2022 · 2 min · jiezi

关于思否技术征文:Javaweb-自定义-Servlet-实现按照访问路径转发

本文参加了思否技术征文,欢送正在浏览的你也退出。前言HttpServlet Service办法 提供的 doGet() 和 doPost() 办法只能依据申请形式进行散发,假如咱们当初有多个服务(增加、删除、查问...),每个服务都要对应一个 Servlet(AddServlet、DeleteServlet、SelectServlet),这样治理起来是很不不便的,咱们心愿应用一个 Servlet 一个实体来解决其业务,比方 BrandServlet 解决 Brand 相干的业务(增删改查),UserServlet 解决 User 相干的业务这里咱们的解决方案有两个 计划一:在拜访是携带参数,而后通过 request.getParameter 获取参数,通过 if 判断进行散发,如:拜访链接为 http://localhost/BrandServlet?method=add,而后通过 request.getParameter("method") 即可获取到 add 参数,再通过 if 进行判断,调用 add() 办法即可计划二:重写 HttpServlet 的 Service 办法,自定义散发规定,间接通过拜访门路进行业务解决这里要介绍的是第二种办法自定义 BaseServlet新建一个 BaseServlet,继承 HttpServlet,重写 Service 办法 package com.ruochen.web.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.lang.reflect.Method;/** * 替换 HttpServlet,依据申请的最初一段门路来进行办法散发 */public class BaseServlet extends HttpServlet { // 依据申请的最初一段门路来进行办法散发 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 获取申请门路 "/brand-case/brand/selectAll" String uri = req.getRequestURI(); // 2. 获取最初一段门路,办法名 int index = uri.lastIndexOf("/"); String methodName = uri.substring(index + 1); // selectAll // 3. 执行办法 // 3.1 获取 BrandServlet / UserServlet 字节码对象 Class // 谁调用我(this 所在的办法),我(this)代表谁 // System.out.println(this); // BrandServlet Class<? extends BaseServlet> cls = this.getClass(); // 3.2 获取办法 Method 对象,执行办法 try { Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (Exception e) { e.printStackTrace(); } }}而后咱们再写一个 UserServlet 测试一下,UserServlet 间接继承 BaseServlet 类就能够 ...

September 17, 2022 · 1 min · jiezi

关于思否技术征文:大话Java异常

本文参加了思否技术征文,欢送正在浏览的你也退出。异样异样的概述异样就是不失常的意思,Java语言中次要是指程序在运行阶段产生的谬误Throwable(可抛出的,可扔出的) java.lang.Throwable 类是Java程序所有谬误或异样的超类次要有两个字类 Error Error次要形容比较严重的谬误无奈通过编程来解决的重大的谬误Exception Exception次要m形容比拟轻量级的谬误能够通过编程来解决Exception类的次要分类RuntimeException -> 运行时异样,也叫非检测性异样类非检测性异样类就是指b编译阶段无奈被编译器检测进去的异样次要子类 ArithmeticException -> 算数异样类ArrayIndexOutOfBoundsException(间接子类) -> 数组下标异样类NullPointerException -> 空指针异样ClassCastException -> 类型转换异样NumberFormatException(间接子类)-> 数字格局异样留神 当程序的执行过程中产生异样,若没有手动进行解决,则由Java虚拟机采纳默认的形式进行解决,默认形式是打印异样名称、异样起因以及异样产生的地位并终止程序,后序代码无奈被执行IOException和其余异样类 -> 其余异样类,也叫做非检测性异样案例TestRuntimeException.java package demo1;import java.io.IOException;import java.io.FileInputStream;import java.io.FileNotFoundException;/* * ArithmeticException -> 算数异样类 ArrayIndexOutOfBoundsException(间接子类) -> 数组下标异样类 NullPointerException -> 空指针异样 ClassCastException -> 类型转换异样 NumberFormatException(间接子类)-> 数字格局异样 */public class TestRuntimeException { public static void main(String[] args) { // 察看检测性异样 // FileInputStream fis = new FileInputStream("c:/a.txt"); // java.lang.ArithmeticException 算数异样 int a = 10; int b = 0; if (b != 0) { System.out.println(a/b); } // java.lang.ArrayIndexOutOfBoundsException 数组下标越界异样 int[] arr = new int[3]; int num = 3; if (num >= 0 && num < arr.length) { System.out.println(arr[num]); } // java.lang.NullPointerException String str = null; if (str != null) { System.out.println(str.length()); } // java.lang.ClassCastException Exception ex = new Exception(); if (ex instanceof IOException) { IOException ie = (IOException) ex; } // java.lang.NumberFormatException String s = "12be"; if (s.matches("\\d+")) { System.out.println(Integer.parseInt(s)); } System.out.println("运行程序完结"); }}异样解决运行时异样的解决形式对于绝大数运行时异样来说,都能够通过条件判断防止异样的产生异样的捕捉语法格局 ...

September 17, 2022 · 4 min · jiezi

关于思否技术征文:Java开发必学知识合集一

本文参加了「思否技术征文」,欢送正在浏览的你也退出。 前言Java开发过程中,罕用且重要的知识点是开发中最根本的,尤其是刚接触Java开发不久的开发者来说,基本功很重要,是间接做Java工作的根本,那么本文就来分享一下在Java开发过程中的罕用的知识点,因为篇幅问题,这里只分享一部分内容,没有分享到的会在前面的博文中分享。 (一)一、equals 和 ==的比照对于Java 学习必备根底知识点:equals 和 == 的比照,具体分析如下所示。 二、知识点1、equals它的作用是判断两个对象是否相等,然而它有两种应用状况: ①:类没有被笼罩equals()办法,则通过equals()比拟该类的两个对象时,等价于通过“==”比拟这两个对象。②:类笼罩了equals()办法,个别都笼罩equals()办法来比拟两个对象的内容是否相等;若它们的内容相等,就返回true(即认为这两个对象雷同)。2、==它的作用就是判断两个对象的地址是否相等。也就是判断两个对象是否为同一个对象。 三、示例这里举一个对于equals的示例,如下:     public class demo {  public static void main(String[] args) {  String a = new String("ab"); // a 为一个援用  String b = new String("ab"); // b 为另一个援用, 对象的内容一样  String aa = "ab"; // 放在常量池中  String bb = "ab"; // 从常量池中查找  if (aa == bb) // true  System.out.println("aa==bb");  if (a == b) // false,不是同一对象  System.out.println("a==b");  if (a.equals(b)) // true  System.out.println("a++b");  if (42 == 42.0) { // true  System.out.println("true");      }  }  } 四、总结在Java学习的时候,必备知识点之一就是equals 和 ==的比照,还请学习者在学习的时候肯定要增强坚固相干常识。通过本文上述解说之后,读者应该分明晓得了equals 和 ==的比照。 ...

September 17, 2022 · 1 min · jiezi

关于思否技术征文:Java开发实现用户注册登录的功能

本文参加了「思否技术征文」,欢送正在浏览的你也退出。 一、前言在Java开发过程中,实现用户的注册性能是最根本的,用户通过手机号或者邮箱作为注册账号也是十分常见的操作形式,不论是通过手机号注册或者邮箱注册,原理都差不多,那么本文就来分享一下在Java开发过程中的用户注册账号的性能实现。二、筹备工作1、通过Java语言来实现用户注册登录的后盾性能;2、应用环境有JDK6、Eclipse、Oracle10G、Tomcat等; 三、具体实现思路及外围步骤1、数据库设计①数据库的表名称以及要求:表名:users 主键:id 字段名称:id:用户id,username:用户名称,password:明码,group_id:用户类型id ②创立数据表,创立主、外键,创立序列,新加测试数据2、应用Eclipse创立web我的项目UserDemo3、给我的项目工程增加Spring、Hibernate等反对,并且正确引入集成到我的项目中,以及配置4、创立数据长久化类,以及对应的映射文件,让用户类型和用户之间建设双向一对多的关系5、新建接口以及实现类,应用spring数据库对象实现对应数据库的操作6、创立service接口以及实现类,并且实现对应的业务逻辑7、创立action类,并引入接口和拜访器,实现配置文件8、新建spring配置文件,实现对应的对象申明和配置9、前端局部的界面搭建,以及接口联调10、测试环节:调试运行胜利之后将对应的相干数据库对象导出sql文件,以及用户注册数据的备份机制解决,实现测试,实现用户注册登录的性能。 四、外围代码1、UserService.java文件的外围代码public interface UserService {    /**     * 用户注册     *     * @param userId     * @param dto     * @throws Exception     */    void userRegister(Long userId, UserRegisterDTO dto) throws Exception;    /**     * 遗记明码     *     * @param userId     * @param dto     * @throws Exception     */    void updatePassword(Long userId, UpdatePasswordDTO dto) throws Exception;    /**     * 通过邮箱发送验证码     *     * @param userId     * @param email     * @throws BusinessException     */    void sendVerificationCode(Long userId, String email) throws BusinessException;    /**     * 通过用户名明码获取用户     *     * @param loginName     * @param loginPwd     * @return     * @throws BusinessException     */    User getUser(String loginName, String loginPwd) throws BusinessException;}2、UserController.java文件的外围代码@RestController@Slf4jpublic class UserController extends BaseController {    private final UserService userService;    @Autowired    public UserController(UserService userService) {        this.userService = userService;    }    /**     * 会员注册     *     * @param dto     * @param request     * @return     * @throws Exception     */    @ApiOperation(value = "会员注册", produces = "application/json")    @ApiResponses({@ApiResponse(code = AjaxReturn.SUCCESS, message = "注冊胜利", response = AjaxReturn.class)})    @PostMapping(path = {"/user-save"})    public AjaxReturn userRegister(@ModelAttribute UserRegisterDTO dto, HttpServletRequest request) throws Exception {        log.info(dto.toString());        Long userId = getAuthentication(request);        if (StringUtils.isBlank(dto.getMobile()) && StringUtils.isBlank(dto.getEmail())) {            throw new BusinessException("请输出手机号或邮箱");        }        if (StringUtils.isNotBlank(dto.getMobile()) && !StringUtils.isNumeric(dto.getMobile())) {            throw new BusinessException("请输出正确的手机号");        }        if (StringUtils.isNotBlank(dto.getEmail()) && !StringUtils.isEmail(dto.getEmail())) {            throw new BusinessException("请输出正确的邮箱");        }        if (StringUtils.isBlank(dto.getLoginPwd())) {            throw new BusinessException("password must not be null");        }        // 明码MD5加密        dto.setLoginPwd(DigestUtils.md5Hex(dto.getLoginPwd()));        if (StringUtils.isBlank(dto.getVerificationCode())) {            throw new BusinessException("verification code must not be null");        }        userService.userRegister(userId, dto);        return AjaxReturn.builder().build();    }    /**     * 遗记明码     *     * @param dto     * @param request     * @return     * @throws Exception     */    @ApiOperation(value = "遗记明码", produces = "application/json")    @ApiResponses({@ApiResponse(code = AjaxReturn.SUCCESS, message = "更新明码胜利", response = AjaxReturn.class)})    @PostMapping(path = {"/user-password-forget"})    public AjaxReturn updatePassword(@ModelAttribute UpdatePasswordDTO dto, HttpServletRequest request) throws Exception {        Long userId = getAuthentication(request);        if (StringUtils.isBlank(dto.getMobile()) && StringUtils.isBlank(dto.getEmail())) {            throw new BusinessException("请输出手机号或邮箱");        }        if (StringUtils.isNotBlank(dto.getMobile()) && !StringUtils.isNumeric(dto.getMobile())) {            throw new BusinessException("请输出正确的手机号");        }        if (StringUtils.isNotBlank(dto.getEmail()) && !StringUtils.isEmail(dto.getMobile())) {            throw new BusinessException("请输出正确的邮箱");        }        if (StringUtils.isBlank(dto.getLoginPwd())) {            throw new BusinessException("password must not be null");        }        // 明码MD5加密        dto.setLoginPwd(DigestUtils.md5Hex(dto.getLoginPwd()));        if (StringUtils.isBlank(dto.getVerificationCode())) {            throw new BusinessException("verification code must not be null");        }        userService.updatePassword(userId, dto);        return AjaxReturn.builder().build();    }    /**     * 通过邮件发送验证码     *     * @param email     * @param request     * @return     * @throws BusinessException     */    @ApiOperation(value = "通过邮件发送验证码", produces = "application/json")    @ApiResponses({@ApiResponse(code = AjaxReturn.SUCCESS, message = "通过邮件发送验证码胜利", response = AjaxReturn.class)})    @PostMapping(path = {"/verification-code-send"})    public AjaxReturn sendVerificationCode(@ApiParam(name = "email", value = "邮箱", required = true) @RequestParam String email, HttpServletRequest request) throws BusinessException {        Long userId = getAuthentication(request);        userService.sendVerificationCode(userId, email);        return AjaxReturn.builder().build();    }}3、LoginController文件 ...

September 17, 2022 · 3 min · jiezi

关于思否技术征文:面试官建造者模式是什么

宝剑锋从磨砺出、梅花香自苦寒来文章继续更新,能够微信搜寻【小奇JAVA面试】第一工夫浏览,回复【材料】更有我为大家筹备的福利哟!回复【我的项目】有我为大家筹备的一些我的项目源码。回复【简历模板】有我为大家筹备的简历模板。 @[TOC] 前言明天的热点新闻不晓得大家看了没有,“定格山东舰霸气霎时”,看到这么雄伟壮观的航空母舰,我不由得感叹祖国变得越来越弱小,咱们领有了真正意义的第一艘国产航空母舰。 借助这个喜事咱们正好来学习一下建造者模式,毕竟只有你好好学习能力为国家做出奉献,只有你学了我的建造者模式,你就能够为国家“建造”航空母舰啦。 一、面试面试官:你能够说一下建造者模式吗? 我:建造者模式是一种较为简单的创立型模式,它将客户端与简单对象的创立过程拆散,客户端毋庸晓得简单对象的外部组成部分与拆卸形式,只须要晓得所需建造者的类型即可。 比方一个航空母舰,它领有多个组成部分,它有多种整机,对于咱们大多数用户来说,咱们并不知道这些整机的装置细节,咱们只须要晓得和应用建造好的航母就能够了。 面试官:你能说一下建造者模式有哪些角色吗? 我:建造者模式中有4个角色。 1、Builder(形象建造者):它为创立一个产品对象的各个部件指定形象接口,在该接口中个别申明两类办法,一类办法是build()办法,它们用于创立简单对象的各个部件;另一类办法是getResult(),它们用于返回简单对象。Builder既能够是抽象类,也能够是接口。 2、ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体结构和拆卸办法,定义并明确所创立的简单对象,还能够提供一个办法返回创立好的简单产品对象(该办法也可由形象建造者实现)。 3、Product(产品):它是被构建的简单对象,蕴含多个组成部件,具体建造者创立该产品的外部示意并定义它的拆卸过程。 4、Director(指挥者):指挥者又称为导演类,它负责安顿简单对象的建造秩序,指挥者与形象建造者之间存在关联关系,能够在其construct()建造办法中调用建造者对象的部件结构与拆卸办法。实现简单对象的建造。客户端个别只须要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也能够通过配置文件和反射机制实现),而后通过指挥者类的构造函数或者Setter办法将该对象传入指挥者类中。 面试官:能够写一个建造者模式的代码例子吗 1、首先须要一个航母实体 public class HangMu { private String JiaBan; //夹板 private String PaoDao; //跑道 private String FeiJI; //飞机 public String getJiaBan() { return JiaBan; } public void setJiaBan(String jiaBan) { JiaBan = jiaBan; } public String getPaoDao() { return PaoDao; } public void setPaoDao(String paoDao) { PaoDao = paoDao; } public String getFeiJI() { return FeiJI; } public void setFeiJI(String feiJI) { FeiJI = feiJI; }}2、而后须要形象建造者类 ...

September 15, 2022 · 1 min · jiezi