Go实战全家桶之一:goconfig依赖注入扩展之自动注入配置项、工业级巨匠

开源地址:

goconfig: git clone https://gitee.com/ichub/go.git

参考springcloud框架

础结构

package ichubconfig

import (
    "gitee.com/ichub/goconfig/common/base/basedto"
    "gitee.com/ichub/goconfig/common/base/baseutils/reflectutils"
    "github.com/gogf/gf/v2/text/gstr"
    "github.com/gogf/gf/v2/util/gconv"
    "github.com/sirupsen/logrus"
    "reflect"
    "strings"
)

type BaseConfig struct {
    basedto.BaseEntitySingle
}

func NewBaseConfig() *BaseConfig {
    var bc = &BaseConfig{}
    bc.InitProxy(bc)
    return bc
}

/*
some is ptr
*/
func (bc *BaseConfig) SetFieldConfigItem(some any, key string, value any) {

    var values = strings.Split(value.(string), ":")
    var rv = FindBeanIchubConfig().ReadVar(gstr.Trim(values[0]))
    var ifnil bool = rv == ""
    if ifnil && len(values) < 2 {
       return
    }
    if ifnil {
       rv = reflect.ValueOf(gstr.Trim(values[1]))
    }

    var rt = reflect.ValueOf(some).Elem()
    var fieldvalue = rt.FieldByName(key)
    switch fieldvalue.Kind() {
    case reflect.Int:
       fieldvalue.SetInt(gconv.Int64(rv))
    case reflect.String:
       fieldvalue.SetString(gconv.String(rv))
    case reflect.Bool:
       fieldvalue.SetBool(gconv.Bool(rv))
    case reflect.Float64:
       fieldvalue.SetFloat(gconv.Float64(rv))
    case reflect.Float32:
       fieldvalue.SetFloat(gconv.Float64(rv))
    case reflect.Uint:
       fieldvalue.SetUint(gconv.Uint64(rv))
    }

}

func (bc *BaseConfig) InjectConfigItem(some any) {

    var linkmap = reflectutils.ParseGoTag(some)

    for _, key := range linkmap.Keys() {
       value, found := linkmap.Get(key)
       if found {
          bc.SetFieldConfigItem(some, key.(string), value)
       }
    }
    if bc.Proxy() == nil {
       panic("some is nil!")
    }
    logrus.Info(some)
}应用

应用结构

 

package goapolloconfig

import (
    "gitee.com/ichub/goconfig/common/ichubconfig"
)

type RedisBaseConfig struct {
    ichubconfig.BaseConfig
    Id            int    `gocfg:"redis.db:0"`
    WebServerName string `gocfg:"web.server.name"`
    MaxLifetime   int    `gocfg:"gorm.maxLifetime:1200"`
}

func NewRedisBaseConfig() *RedisBaseConfig {
    var rbc = &RedisBaseConfig{}
    rbc.InitProxy(rbc)
    return rbc
}

定义接口

package baseiface

type IbaseConfig interface {
    InjectConfigItem(some any)
}

godi di all生成注入代码

package goapolloconfig

import (
    "gitee.com/ichub/goconfig/common/base/baseiface"
    "gitee.com/ichub/goconfig/common/basedi"
    "github.com/sirupsen/logrus"
    "gitee.com/ichub/goconfig/common/base/baseutils/goutils"

)

/*
* ********************************************************
* godi工具生成代码,不建议直接修改!
* ********************************************************
*/

/* ********************************************************
    @Title  文件名称: redis_base_config_init.go
    @Desp   描述:    自动注册注入

    @Author 作者: leijmdas@163.com 时间(2024-08-31 18:38:25)
    @Update 作者: leijmdas@163.com 时间(2024-08-31 18:38:25)

* *********************************************************/

const singleNameRedisBaseConfig = "*goapolloconfig.RedisBaseConfig-e60c0d18ff434618ac3cf28656cfb7dc"

// init register load
func init() {
    registerBeanRedisBaseConfig()
}

// register RedisBaseConfig
func registerBeanRedisBaseConfig() {
    basedi.RegisterLoadBean(singleNameRedisBaseConfig, LoadRedisBaseConfig)
}

func FindBeanRedisBaseConfig() *RedisBaseConfig {
    bean, ok :=  basedi.FindBean(singleNameRedisBaseConfig).(*RedisBaseConfig)
    if !ok {
        logrus.Errorf("FindBeanRedisBaseConfig: failed to cast bean to *RedisBaseConfig")
        return nil
    }
    return bean

}

func LoadRedisBaseConfig() baseiface.ISingleton {
    var s = NewRedisBaseConfig()
    InjectRedisBaseConfig(s)
    return s

}

func InjectRedisBaseConfig(s *RedisBaseConfig)    {

    goutils.Debug("inject")
}

 

测试用例与测试结果

 

func Test012_FindBeanRedisBaseConfig(t *testing.T) {

    FindBeanRedisBaseConfig()

}

INFO[2024-08-831 18:51:57]D:/go-ichub/go/goconfig/common/ichubconfig/base_config.go:70 gitee.com/ichub/goconfig/common/ichubconfig.(*BaseConfig).InjectConfigItem() {
     "Id": 0,
     "WebServerName": "web.server.com",
     "MaxLifetime": 7200

注入代码实现:

 

func (this *beanContainer) FindBean(name string) (*BeanInfo, bool) {
    this.lock.RLock()
    defer this.lock.RUnlock()

    var beanInfo, ok = this.container[name]
    if !ok {
       logrus.Error(name, " bean found?", ok)
       return nil, ok
    }
    if beanInfo.bean == nil {
       beanInfo.SetBean(beanInfo.CreateBean())
    }
    this.autoInjectConfigItem(beanInfo)
    return beanInfo, ok
}

func (this *beanContainer) autoInjectConfigItem(beanInfo *BeanInfo) {
    if ibcfg, ok := beanInfo.bean.(baseiface.IbaseConfig); ok {
       ibcfg.InjectConfigItem(ibcfg)
    }
}

配置文件:

b1964e18961a406998772fe276232d42.png

 

  • 31
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值