ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

beego源码解析之配置文件

2021-06-09 19:29:39  阅读:125  来源: 互联网

标签:beego type string 配置文件 Config 源码 key error config


目录

组件

config.go 公共参数

beegoAppConfig struct

config.Configer接口

config.Config 接口

初始化的流程


 

组件

 

config.go 公共参数

var (
   // BConfig是程序中s默认的配置变量
   BConfig *Config
   // AppConfig保存着文件中的配置项,使用的是 config包下的接口
   AppConfig *beegoAppConfig
   // AppPath是程序的绝对路径
   AppPath string
   // GlobalSessions是管理 session的实例
   GlobalSessions *session.Manager
​
   // appConfigPath 是配置文件的保存路径
   appConfigPath string
   // appConfigProvider is the provider for the config, default is ini
   appConfigProvider = "ini"
)

 

BConfig : 包含了App运行过程中需要用到的配置信息 。 Config实体中包含了Listen、WebConfig 、SessionConfig、LogConfig四个常用配置实体

AppConfig : 配置文件的解析接口 , 用来解析配置文件,初始化BConfig

 

beegoAppConfig struct

封装了config.Configer接口,并由newAppConfig 方法完成实例化。beegoAppConfig的方法基本上都是由configer的不同实现来完成的。

type beegoAppConfig struct {
   innerConfig config.Configer
}
// 根据配置的配置器名("xml"等),获得对应的配置器实例
func newAppConfig(appConfigProvider, appConfigPath string) (*beegoAppConfig, error) {
   ac, err := config.NewConfig(appConfigProvider, appConfigPath)
   if err != nil {
      return nil, err
   }
   return &beegoAppConfig{ac}, nil
}

 

config.Configer接口

type Configer interface {
   Set(key, val string) error   //support section::key type in given key when using ini type.
   String(key string) string    //support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
   Strings(key string) []string //get string slice
   Int(key string) (int, error)
   Int64(key string) (int64, error)
   Bool(key string) (bool, error)
   Float(key string) (float64, error)
   DefaultString(key string, defaultVal string) string      // support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
   DefaultStrings(key string, defaultVal []string) []string //get string slice
   DefaultInt(key string, defaultVal int) int
   DefaultInt64(key string, defaultVal int64) int64
   DefaultBool(key string, defaultVal bool) bool
   DefaultFloat(key string, defaultVal float64) float64
   DIY(key string) (interface{}, error)
   GetSection(section string) (map[string]string, error)
   SaveConfigFile(filename string) error
}

 

config.Config 接口

//该接口提供了实例化configer接口的两个方法
type Config interface {
   Parse(key string) (Configer, error)
   ParseData(data []byte) (Configer, error)
}
//这是一个各种不同Config实现的map对象
var adapters = make(map[string]Config)
​
//这是注册配置文件解析器的方法,先注册,然后就可以初始化了。
func Register(name string, adapter Config) {
   if adapter == nil {
      panic("config: Register adapter is nil")
   }
   if _, ok := adapters[name]; ok {
      panic("config: Register called twice for adapter " + name)
   }
   adapters[name] = adapter
}
​
//config.go -> newAppConfig(...){ config.newConfig(...)}
//根据解析器类型和文件路径初始化configer解析器的方法
func NewConfig(adapterName, filename string) (Configer, error) {
   adapter, ok := adapters[adapterName]
   if !ok {
      return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
   }
   return adapter.Parse(filename)
}

 

初始化的流程

1、beego.Run(){

addr := BConfig.Listen.HTTPAddr

//BConfig.Listen.HTTPAddr的访问,将触发 config.go -> init方法

}

2、config.go -> init()

func init() {
   AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
​
   os.Chdir(AppPath)
   // 初始化 BCconfig变量
   BConfig = &Config{
      //默认的配置项
   }
   //拼接地址
   appConfigPath = filepath.Join(AppPath, "conf", "app.conf")
   if !utils.FileExists(appConfigPath) {
      //如果文件不存在,则初始化一个空配置项 
      AppConfig = &beegoAppConfig{innerConfig: config.NewFakeConfig()}
      return
   }
   // 解析配置项,并保存在 BConfig中
   // 采用默认的解析实现 , 解析文件
   if err := parseConfig(appConfigPath); err != nil {
      panic(err)
   }
}

标签:beego,type,string,配置文件,Config,源码,key,error,config
来源: https://blog.csdn.net/u012391423/article/details/117752558

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有