最近想要转向golang,然后发现go的生态还不够强大,众所周知spring依托ioc和apo成为了一方霸主,私以为golang还是需要ioc的,遂在网上寻找包。发现有滴滴开源的go-spring,意图实现go语言上的springboot,只能说大厂还是相对有保证的。就先摸索了。GItee地址 github地址
虽说是大厂,但是文档真的很难让我这种菜鸟入门,一头雾水。。。毕竟go和java是不同的语言,很多实现上都和java不同,在此呼吁滴滴出个好一点的教程(笑)。现有文档地址
经过一段时间的探索,大概能跑起来了。
IOCioc是spring 的灵魂,这里做一个简单的注入演示。
首先先完成一个简单的实体类,随意创建一个go文件
package pojo
type Person struct {
Name string `value:"${GOPATH}"`
}
其中value:"${GOPATH}"
是属性的标签,用于注入属性的,相当于,注入键值对GOPATH的值。
然后写一个主文件main.go
package main
import (
"fmt"
Spring "github.com/go-spring/spring-core"
PojoPerson "mygo/pojo"
)
func main() {
context:=Spring.DefaultApplicationContext()
//获得context
context.SetProperty("Name","hello")
//增加键值对,常规是从文件读取,这里图个方便,
context.SetProperty("GOPATH","hello")
var person *PojoPerson.Person
//声明指针类型,准备用作后来注入
context.RegisterBean(&PojoPerson.Person{})
//传入一个指针类型,表示注册一个这个类型的变量
context.AutoWireBeans()
//开启自动注入,也可以用WireBean手动注入
fmt.Println(context.GetBean(&person))
//函数返回bool ,true表示获得成功,false表示失败,如果是true,那么变量已经被注入person中了
fmt.Println(*person)
//打印对象
}
Gin web/Echo web
echoweb官方给了案例
import (
"context"
"github.com/go-spring/spring-boot"
_ "github.com/go-spring/starter-echo"
)
func init() {
SpringBoot.RegisterBean(new(Service)).Init(func(s *Service) {
SpringBoot.GetBinding("/", s.Echo)
})
}
type Service struct {
GoPath string `value:"${GOPATH}"`
}
type EchoRequest struct{}
func (s *Service) Echo(ctx context.Context, req *EchoRequest) interface{} {
return s.GoPath
}
func main() {
SpringBoot.RunApplication()
}
进入http://localhost:8080/
得到返回{"code":200,"msg":"SUCCESS","data":"/Users/didi/go"}
本人主要用gin,以GIn为例,进行化简
package main
import (
"context"
"github.com/go-spring/spring-boot"
_ "github.com/go-spring/starter-gin"
)
func init() {
SpringBoot.GetBinding("/", func (ctx context.Context, req *request) string {
return "1"
})
}
type request struct {
}
func main() {
SpringBoot.RunApplication()
}
进入http://localhost:8080/
得到返回{"code":200,"msg":"SUCCESS","data":"1"}
相信不少读者已经发现了,所有都以json串来返回,这大概是因为didi内部都是前后端分离的,所以只留出接口。但是对于我们这种学生开发者来说,最好是能自定义,不论是传什么内容都可以。
经过阅读源码,SpringBoot.GetBinding方法会通过BIND方法绑定,BIND方法涉及bindhandler,这个bindhandle里面已经写死了使用json传输,并在源码中提示目前GetBinding只支持json。
那就没办法了吗?通过阅读文档和源码,发现HandleGet方法接受Handler对象,而这个方法没有直接bind,通过源码找到了他的一个实现ginHandler,可惜ginHandler首字母是小写的,遂考虑调用他的原本类型gin.HandlerFunc,结果兜兜转转,发现有个SpringGin.Gin方法可以接受gin.HandlerFunc,并返回Handler,直接调用即可。这样就能调用gin的原生接口。
package main
import (
"github.com/gin-gonic/gin"
"github.com/go-spring/spring-boot"
SpringGin "github.com/go-spring/spring-gin"
_ "github.com/go-spring/starter-gin"
"net/http"
)
func init() {
SpringBoot.HandleGet("/", SpringGin.Gin(func(c *gin.Context) {
c.String(http.StatusOK, "Who are you?")
}) )
}
func main() {
SpringBoot.RunApplication()
}
进入http://localhost:8080/
得到返回Who are you?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)