一站式开发框架 Go-Spring 发布 v1.1.2 版本
距离上次发版仅两周的时间,Go 后端一站式开发框架 Go-Spring 又发布了新的版本,新版本实现了两个非常重要的特性:动态配置和 Bean 共享。
动态配置
有时候我们想要在不停机的情况下可以修改程序的配置,更改程序的行为,即所谓的“动态配置”。Go-Spring 通过使用专门的数据类型实现了和普通属性一样的使用方式,既支持默认值,也支持类型校验,同时还保证了数据的并发安全,非常简单且强大。
type DynamicConfig struct { Int dync.Int64 `value:"${int:=3}" validate:"$<6"` Float dync.Float64 `value:"${float:=1.2}"` Map dync.Ref `value:"${map:=}"` Slice dync.Ref `value:"${slice:=}"` Event dync.Event `value:"${event}"` } type DynamicConfigWrapper struct { Wrapper DynamicConfig `value:"${wrapper}"` } func TestDynamic(t *testing.T) { var cfg *DynamicConfig wrapper := new(DynamicConfigWrapper) c := gs.New() c.Provide(func() *DynamicConfig { config := new(DynamicConfig) config.Int.OnValidate(func(v int64) error { if v < 3 { return errors.New("should greeter than 3") } return nil }) config.Slice.Init(make([]string, 0)) config.Map.Init(make(map[string]string)) config.Event.OnEvent(func(prop *conf.Properties) error { fmt.Println("event fired.") return nil }) return config }).Init(func(config *DynamicConfig) { cfg = config }) c.Object(wrapper).Init(func(p *DynamicConfigWrapper) { p.Wrapper.Slice.Init(make([]string, 0)) p.Wrapper.Map.Init(make(map[string]string)) p.Wrapper.Event.OnEvent(func(prop *conf.Properties) error { fmt.Println("event fired.") return nil }) }) err := c.Refresh() assert.Nil(t, err) { b, _ := json.Marshal(cfg) assert.Equal(t, string(b), `{"Int":3,"Float":1.2,"Map":{},"Slice":[],"Event":{}}`) b, _ = json.Marshal(wrapper) assert.Equal(t, string(b), `{"Wrapper":{"Int":3,"Float":1.2,"Map":{},"Slice":[],"Event":{}}}`) } { p := conf.New() p.Set("int", 4) p.Set("float", 2.3) p.Set("map.a", 1) p.Set("map.b", 2) p.Set("slice[0]", 3) p.Set("slice[1]", 4) p.Set("wrapper.int", 3) p.Set("wrapper.float", 1.5) p.Set("wrapper.map.a", 9) p.Set("wrapper.map.b", 8) p.Set("wrapper.slice[0]", 4) p.Set("wrapper.slice[1]", 6) c.Properties().Refresh(p) } { b, _ := json.Marshal(cfg) assert.Equal(t, string(b), `{"Int":4,"Float":2.3,"Map":{"a":"1","b":"2"},"Slice":["3","4"],"Event":{}}`) b, _ = json.Marshal(wrapper) assert.Equal(t, string(b), `{"Wrapper":{"Int":3,"Float":1.5,"Map":{"a":"9","b":"8"},"Slice":["4","6"],"Event":{}}}`) } }
Bean 共享
Java Spring Redis 在首页使用了一个非常特别的特性,可以将一个 Bean 的字段值注入到另一个对象中,看起来就像是 Bean 被共享了。现在 Go-Spring 也能支持这样的使用方式。
type runner struct { Client *redis.Client `autowire:""` StrOps *redis.StringOperations `autowire:"RedisClient"` } func (r *runner) Run(ctx gs.Context) { _, err := r.Client.OpsForString().Get(ctx.Context(), "nonexisting") if !redis.IsErrNil(err) { panic(errors.New("should be redis.ErrNil")) } _, err = r.Client.OpsForString().Set(ctx.Context(), "mykey", "Hello") util.Panic(err).When(err != nil) v, err := r.Client.OpsForString().Get(ctx.Context(), "mykey") util.Panic(err).When(err != nil) if v != "Hello" { panic(errors.New("should be \"Hello\"")) } v, err = r.StrOps.Get(ctx.Context(), "mykey") util.Panic(err).When(err != nil) if v != "Hello" { panic(errors.New("should be \"Hello\"")) } go gs.ShutDown() } func main() { gs.Object(&runner{}).Export((*gs.AppRunner)(nil)) fmt.Printf("program exited %v\n", gs.Web(false).Run()) }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Loginsight 3.0.0 正式发布:致力于打造一款日志分析利器
loginsight已经成为我坚持最久的开源项目,因为我们真的离不开一款趁手的日志分析工具。 为了支持语法高亮、服务端日志、分段日志等各种需求,狠下心再次从底层重构了源码。预计2个月的开发周期,历经半年终于完成。 这次重构,带来了: 日志高亮,虽然还比较粗糙,但至少有了 界面和后端完全分离,开源参与者门槛大大降低,也可以更专注于界面和交互逻辑 日志高亮不仅仅是高亮,更是为底层设置了日期、等级等一系列的信息,将带来更多、更智能的分析工具 后端分离为后续的远程日志查看也作了铺垫,指日可待 完整更新日志 项目主页 源码仓库
- 下一篇
Hexo Fluid 博客主题更新 1.9.3 版本
主要更新内容 许可协议可以被隐藏 TOC 支持自定义配置 优化重载事件触发 修改文字计数逻辑 略微缩短导航栏二级菜单的宽度 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题