【首发】Go-Spring基础教程

【首发】Go-Spring基础教程,第1张

Go-Spring基础教程

      最近想要转向golang,然后发现go的生态还不够强大,众所周知spring依托ioc和apo成为了一方霸主,私以为golang还是需要ioc的,遂在网上寻找包。发现有滴滴开源的go-spring,意图实现go语言上的springboot,只能说大厂还是相对有保证的。就先摸索了。GItee地址 github地址

      虽说是大厂,但是文档真的很难让我这种菜鸟入门,一头雾水。。。毕竟go和java是不同的语言,很多实现上都和java不同,在此呼吁滴滴出个好一点的教程(笑)。现有文档地址

      经过一段时间的探索,大概能跑起来了。

IOC

      ioc是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?

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存