di

package
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2024 License: Apache-2.0 Imports: 5 Imported by: 0

README

golang 依赖注入

golang实现DI容器

基于反射实现依赖注入容器

Features

  • 注册/获取依赖
  • 基于tag自动注入依赖
  • 对于私有字段,调用SetXxx进行反射赋值。

依赖类型

  • 单例依赖
  • 实例依赖

本项目依赖

使用标准库实现,无额外依赖

依赖注入的优势

用java的人对于spring框架一定不会陌生,spring核心就是一个IoC(控制反转/依赖注入)容器,带来一个很大的优势是解耦。一般只依赖容器,而不依赖具体的类,当你的类有修改时,最多需要改动一下容器相关代码,业务代码并不受影响。

golang的依赖注入原理

总的来说和java的差不多,步骤如下:(golang不支持动态创建对象,所以需要先手动创建对象然后注入,java可以直接动态创建对象) 通过反射读取对象的依赖(golang是通过tag实现) 在容器中查找有无该对象实例 如果有该对象实例或者创建对象的工厂方法,则注入对象或使用工厂创建对象并注入 如果无该对象实例,则报错

最重要的是Ensure方法,该方法扫描实例的所有export字段,并读取di标签,如果有该标签则启动注入。 判断di标签的类型来确定注入singleton或者prototype对象

测试

  1. 单例对象在整个容器中只有一个实例,所以不管在何处注入,获取到的指针一定是一样的。
  2. 实例对象是通过同一个工厂方法创建的,所以每个实例的指针不可以相同。

Documentation

Overview

Package dig

@author: xwc1125

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrFactoryNotFound = errors.New("factory not found")
)

Functions

func FirstUpper

func FirstUpper(s string) string

FirstUpper 字符串首字母大写

Types

type Container

type Container struct {
	sync.Mutex
	// contains filtered or unexported fields
}

Container 容器

func NewContainer

func NewContainer() *Container

NewContainer 容器实例化

func (*Container) Ensure

func (p *Container) Ensure(instance interface{}) error

Ensure 注入依赖 该方法扫描实例的所有export字段,并读取di标签,如果有该标签则启动注入。 判断di标签的类型来确定注入singleton或者prototype对象

func (*Container) Ensures

func (p *Container) Ensures(instances ...interface{}) error

func (*Container) GetPrototype

func (p *Container) GetPrototype(name string) (interface{}, error)

GetPrototype 获取实例对象

func (*Container) GetSingleton

func (p *Container) GetSingleton(name string) interface{}

GetSingleton 获取单例对象

func (*Container) SetPrototype

func (p *Container) SetPrototype(name string, factory factory)

SetPrototype 设置实例对象工厂

func (*Container) SetSingleton

func (p *Container) SetSingleton(name string, singleton interface{})

SetSingleton 注册单例对象

func (*Container) String

func (p *Container) String() string

String 打印容器内部实例

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL