Golang 中国

谈谈依赖注入

作为一名Java老程序员,用习惯了Spring框架后转到Go有很多不适应,什么MVC,什么IOC,DI通通没有。那为什么要使用Go呢?直接使用Java不就是了!当然是因为Go的易用性和并发处理能力等优势深深吸引了我。

那接下来就开始海淘是否有个类Spring的框架,Web框架有Beego,Gin,Iris,Martini等等,依赖注入框架有facebook-go/inject和uber/dig. 各个翻了个遍,都没有我想要的类似Spring Boot的功能。

Hiboot是我用Go语言实现的类似Spring Boot的网络或命令行客户端的应用框架,Hiboot提供了Web MVC框架,支持依赖注入,依赖自动配置,提供类似Spring Boot提供的Starter。

控制反转是一种设计思想,适用于任何编程语言。包含了服务定位器(Service Locator),事件(Events),委托(Delegates)和依赖注入(Dependency Injection)。到目前为止,Hiboot实现了依赖注入部分,所以我们主要来讲解依赖注入部分。如何编写出松耦合,易维护的应用是Hiboot框架的设计初衷。根据这个设计思想,我们不应该在结构体,函数或方法中静态的配置其依赖,而应该将依赖配置在外部。

ioc

总览

  • Web MVC (Model-View-Controller).
  • 自动配置starter
  • 依赖注入使用tag inject:"" 或者构造函数注入

功能列表

  • Apps - 应用
    • cli - 命令行应用
    • web - 网络应用
  • Starters - 自动配置
    • actuator - 健康检测
    • locale - 国际化
    • logging - 日志
    • jwt - JWT 令牌
    • grpc - 服务间通讯gRPC
  • Tags - 标签
    • inject - 注入依赖
    • default - 注入默认值
    • value - 注入常量,环境变量或引用值
  • Utils - 工具
    • cmap - 支持并发的map
    • copier - 复制struct工具
    • crypto - aes, base64, md5, and rsa 加/解密工具
    • gotest - go test 工具
    • idgen - twitter snowflake 唯一 id 生成器
    • io - 文件操作工具
    • mapstruct - 转换map 到 struct
    • replacer - 替换struct中的值为引用或环境变量
    • sort - 切片排序
    • str - 字符串处理工具
    • validator - 参数校验

快速入门

现在我们来看看Hiboot是怎么使用的。

获取代码

go get -u hidevops.io/hiboot

cd $GOPATH/src/hidevops.io/hiboot/examples/web/helloworld/

代码示例


package main

import (
    "hidevops.io/hiboot/pkg/app"
    "hidevops.io/hiboot/pkg/app/web"
)


// HelloService is a simple service interface, with interface, we can mock a fake service in unit test
type HelloService interface {
    SayHello(name string) string
}

type helloServiceImpl struct {
}

func init() {
    // Register Rest Controller through constructor newHelloController
    web.RestController(newHelloController)

    // Register Service through constructor newHelloService
    app.Component(newHelloService)
}

// please note that the return type name of the constructor HelloService,
// hiboot will instantiate a instance named helloService for dependency injection
func newHelloService() HelloService {
    return &helloServiceImpl{}
}

// SayHello is a service method implementation
func (s *helloServiceImpl) SayHello(name string) string {
    return "Hello" + name
}

// PATH: /login
type helloController struct {
    web.Controller
    helloService HelloService
}

// newHelloController inject helloService through the argument helloService HelloService on constructor
func newHelloController(helloService HelloService) *helloController {
    return &helloController{
        helloService: helloService,
    }
}

// Get /
// The first word of method name is the http method GET
func (c *helloController) Get(name string) string {
    return c.helloService.SayHello(name)
}

func main() {
    web.NewApplication().Run()
}

想了解更多信息,请参考 githubHiboot文档


johnd 于 2018-11-05 10:08 修改
2 回复
fanspace
#1 fanspace • 2018-10-31 15:47

写到最后,发现又是一个变种JAVA

johnd
#2 johnd • 2018-11-05 10:11

@fanspace 控制反转是一种设计思想,适用于任何编程语言。Java实现了IOC,但是不能说IOC=JAVA。Hiboot本意是给Java程序员提供一个熟悉的,容易入门的应用框架。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。

作者

发表话题

作者其它话题