Gone——golang依赖注入框架介绍

2024-06-20 12:12

本文主要是介绍Gone——golang依赖注入框架介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Gone是什么
    • 特性
    • 小试牛刀
    • 概念与启动流程
      • 人话版本
      • 鬼话版本
      • 代码版本
    • 关于Logo

logo

Gone是什么

首先,Gone是Golang的一个轻量级的依赖注入框架,目前依赖注入的装配流程是通过反射来实现的;虽然golang的反射一直被人诟病太慢,但是在Gone中依赖注入只是程序的启动阶段,不影响运行阶段的速度,最多就是给启动过程增加几毫秒的时间,带来的好处却是不再需关心各种依赖如何创建。

其次,为了方便用户能够快速上手,我们开发了一系列内置组件,比如 xorm、redis、schedule、tracer、logrus、gin、cmux、zap、viper 等等,后续我们还会支持更多微服务中间件的接入;用户可以利用这些组件快速开发出一个云原生的微服务,所以Gone一套微服务解决方案

特性

  • 定义Goner接口,对依赖进行抽象
  • 依赖注入
    • 注入Goners
    • 注入函数参数
  • 模块化,可拆卸设计
  • 启动流程控制
  • 测试支持
  • 内置组件
    • goner/config,支持配置参数的依赖注入
    • goner/tracer,给调用链路增加TraceId,支持链路追踪
    • goner/logrus、goner/zap,支持日志记录
    • goner/gin,集成gin框架,提供HTTP请求参数的依赖注入
    • goner/viper,用于解析多种配置文件

小试牛刀

下面使用Gone来编写一个简单的Web服务,更多例子在快速开始 和 example。

package mainimport ("fmt""github.com/gone-io/gone""github.com/gone-io/gone/goner"
)// 实现一个Goner,什么是Goner? => https://goner.fun/zh/guide/core-concept.html#goner-%E9%80%9D%E8%80%85
type controller struct {gone.Flag //goner 标记,匿名嵌入后,一个结构体就实现了Gonergone.RouteGroup `gone:"gone-gin-router"` //注入根路由
}// 实现 Mount 方法,挂载路由;框架会自动执行该方法
func (ctr *controller) Mount() gone.GinMountError {// 定义请求结构体type Req struct {Msg string `json:"msg"`}//注册 `POST /hello` 的 处理函数ctr.POST("/hello", func(in struct {to  string `gone:"http,query"` //注入http请求Query参数Toreq *Req   `gone:"http,body"`  //注入http请求Body}) any {return fmt.Sprintf("to %s msg is: %s", in.to, in.req.Msg)})return nil
}func main() {//启动服务gone.Serve(func(cemetery gone.Cemetery) error {// 调用框架内置组件,加载gin框架_ = goner.GinPriest(cemetery)//将 一个controller类型的Goner埋葬到墓园//埋葬是什么意思? => https://goner.fun/zh/guide/core-concept.html#bury-%E5%9F%8B%E8%91%AC//墓园是什么意思? => https://goner.fun/zh/guide/core-concept.html#cemetery-%E5%A2%93%E5%9B%ADcemetery.Bury(&controller{})return nil})
}

运行上面代码:go run main.go,程序将监听8080端口,使用curl测试:

curl -X POST 'http://localhost:8080/hello' \
-H 'Content-Type: application/json' \
--data-raw '{"msg": "你好呀?"}'

结果如下:

{"code":0,"data":"to  msg is: 你好呀?"}

概念与启动流程

人话版本

代码写完了,跑得起来才行。

在Gone框架中,组件叫住Goner,Goner的属性可以是:interface、slice、map,程序启动时他们将被自动装配。在Gone启动前,需要将所有的Goners注册到Gone框架,启动时Gone会对所有Goners的属性进行自动装配,完成依赖注入,编写组件不必关心依赖的实现和依赖的接口是如何来的,只需要直接使用就可以了。

鬼话版本

我们编写的代码终究只是死物,除非他们被运行起来。

在Gone中,组件被抽象为 Goner(逝者),Goner 属性可以注入其他的 Goner 。Gone启动前,需要将所有 Goners 埋葬 到 墓园;Gone启动后,会 复活 所有 Goners,建立一个 天国,“天国的所有人都不再残缺,他们想要的必定得到满足”。

代码版本

package mainimport ("fmt""github.com/gone-io/gone"
)// Worker 接口
type Worker interface {Do()
}
type Boss struct {gone.Flagworkers []Worker `gone:"*"` //Boss 依赖 Worker接口,通过 gone标签标记为需要依赖注入
}func (b *Boss) Do() {for _, w := range b.workers {w.Do()}
}// WorkerX 实现 Worker 接口
type WorkerX struct {gone.Flag
}func (w *WorkerX) Do() {fmt.Println("WorkerX Do")
}func main() {gone.//Goner启动前的准备工作Prepare(func(cemetery gone.Cemetery) error {cemetery.//注册BossBury(&Boss{}).//注册多个Worker GonersBury(&WorkerX{}).Bury(&WorkerX{}).Bury(&WorkerX{})return nil}).//Goner启动Run(func(boss *Boss) { //Run 方法中的参数被自动注入boss.Do()})
}

了解更多,请阅读 开发指南

关于Logo

Golang的吉祥物是一只可爱的地鼠,Gone的Logo是从它衍生出来,加上翅膀加上光圈,是一只天使地鼠,我们感觉这很复活Gone鬼故事的气质。

这篇关于Gone——golang依赖注入框架介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078098

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开