Gone框架介绍1 - 在go语言上实现依赖注入,Gone是如何实现的?

文章目录

我在两年前实现了一个Golang的依赖注入框架,并且集成了gin、xorm、redis、cron、消息中间件等功能,自己觉得还挺好用的;之前一直没有时间写文档推广,现在"毕业了",有时间来完善完善了。

github地址:https://github.com/gone-io/gone

如果有可能,请帮忙在github上点个 ⭐️??万分感谢!!

Goner的定义

在Gone应用中,所有的组件都被要求定义为Goner(就是"继承"了gone.Flag的结构体,实际上golang中根本没有"集成"这个概念,它有的只有匿名嵌套);如果Goner的某个属性标注了gone:""标签,Gone框架将尝试自动装配该属性。下面是定义一个Goner的例子:

go 复制代码
package example

import "github.com/gone-io/gone"

type AGoner struct {
	gone.Flag
}

在另一个Goner中注入上面定义的AGoner:

go 复制代码
package example

import "github.com/gone-io/gone"

type BGoner struct{
    gone.Flag
    A *AGoner `gone:"*"` //gone标签的作用在于告诉Gone,该属性需要被自动注入一个值
}

其中,注入的和被注入的结构体都要求是Goner(也就是匿名嵌套了gone.Flag的结构体),BGonerA属性的gone:"*"标签的作用在于告诉框架:这个属性需要被注入一个值。

在Gone中是如何完成依赖注入的?

在Java Spring中,给class打上@Component@Service等标注,Spring启动时会自动扫描到这些特殊的类,然后实例化他们并且给他们有特定标注的属性注入对应的值。

Spring之所以能够实现这样的功能,Java有一个特性很关键,就是Java代码在编译成jar后,会保留所有class的字节码,哪怕是没有被main函数依赖的class代码;然而,在Golang中,编译后的代码会被裁剪,二进制文件中只会保留main函数依赖的相关代码。所以我们仅是定义Goner,在编译后我们会发现我们Goner代码全部被裁剪了。

如何让我们的Goners 不被裁剪掉呢?答案很简单,我们显式的将所有Goner加入到一个"仓库"中;在Gone中,这个仓库叫做CemeteryGoner有"死者"的意思;Cemetery是墓地,用于埋葬(Bury)Goner。我们可以在程序启动时,将所有的Goner 实例化后并加入到Cemetery中:

go 复制代码
package main

import "example"
import "github.com/gone-io/gone"

func main() {
	gone.Run(func(cemetery gone.Cemetery) error {
        cemetery.Bury(&example.AGoner{})
		cemetery.Bury(&example.BGoner{})
        return nil
	})
}

在上面的代码中,我们看到gone.Run可以接收形式如 func (cemetery gone.Cemetery) error 的函数;实际上这个函数,我们称之为 Priest ,是牧师的意思,他专门负责将 Goner 埋葬到 墓地(Cemetery)。

下一篇:Gone框架介绍2 - 如何执行Goner中的业务代码?

相关推荐
打工的小王4 小时前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
80530单词突击赢6 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法6 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy7 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇7 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3167 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1117 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日7 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu8 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人9 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python