【好库自荐】像JAVA Spring一样用注解完成自动化依赖注入

just_maple · · 1098 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

这个工具参考了JAVA的思路 解决了`wire`使用最大的痛点 同时将组件关系的维护转移到组件本身 对多人协作项目的管理更加友好 在某企业有10w行级代码项目稳定成熟实践 附上个人开源版链接 https://github.com/Just-maple/go-autowire # Go-AutoWire > 使用注解自动生成wire依赖注入文件 项目需要依赖google的依赖注入框架 [wire](https://github.com/google/wire) 但是极大地简化了使用步骤 极大增大了可以使用场景和降低使用门槛 ## 安装 安装`wire`: ```sh go get github.com/google/wire/cmd/wire ``` then 安装`gutowire` ```sh go get github.com/Just-maple/go-autowire/cmd/gutowire ``` 确保`$GOPATH/bin`已经添加到环境变量`$PATH` ## 使用示范 如果我们需要构造一个动物园 我们有以下的结构体定义 ```go package example type Zoo struct{ Cat Cat Dog Dog FlyAnimal FlyAnimal } type Cat struct{ } type FlyAnimal interface{ Fly() } type Bird struct{ } func (b Bird)Fly(){ } type Dog struct{ } ``` 如果使用原生`wire`,需要自己手动维护以下一份文档 ```go package example_zoo import ( "github.com/google/wire" ) var zooSet = wire.NewSet( wire.Struct(new(Zoo), "*"), ) var animalsSet = wire.NewSet( wire.Struct(new(Cat), "*"), wire.Struct(new(Dog), "*"), wire.Struct(new(Bird), "*"), wire.Bind(new(FlyAnimal), new(Bird)), ) var sets = wire.NewSet(zooSet, animalsSet) func InitZoo() Zoo { panic(wire.Build(sets)) } ``` 如果你的依赖关系有变动 那么所有的变更都需要在这一份文档进行修改 如果你的动物园越来越大 那么这个文件也会越来越复杂 ### 使用`gutowire` 通过写注解的方式 将依赖注入的声明转移到组件定义处 ```go package example // @autowire.init(set=zoo) // .init 表示会基于Zoo生成一个实例化入口 // set=zoo代表该组件会被收集到zoo容器 type Zoo struct{ Cat Cat Dog Dog FlyAnimal FlyAnimal } // @autowire(set=animals) type Cat struct{ } type FlyAnimal interface{ Fly() } // 无参数名的FlyAnimal代表Bird作为FlyAnimal接口实现注入 // @autowire(set=animals,FlyAnimal) type Bird struct{ } func (b Bird)Fly(){ } // @autowire(set=animals) type Dog struct{ } ``` `@autowire.init` 的`.init`表示作为根对象,将会自动生成实例化入口 ```go // Code generated by go-autowire. DO NOT EDIT. // +build wireinject // package example_zoo import "github.com/google/wire" func InitializeZoo() (*Zoo, func(), error) { panic(wire.Build(Sets)) } ``` 执行命令 ```sh gutowire -s ./example_zoo ./example_zoo ``` `-s` 代表依赖项的搜索范围(文件夹目录) 然后你会发现 使用`wire`所有需要手写的东西都会自动生成了 可以看以下示例: - [example_zoo](https://github.com/Just-maple/go-autowire/tree/master/example_zoo) - [example](https://github.com/Just-maple/go-autowire/tree/master/example/autowire_gen) 复杂依赖的生成

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1098 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传