From e1f330f8019df9e769295ce89dfffcdbff3a5a22 Mon Sep 17 00:00:00 2001 From: yuanzhao <2206582181@qq.com> Date: Fri, 16 Aug 2024 18:52:16 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=8E=A5=E5=8F=A3=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- console/commands/bean.go | 13 ++++++++++++- docs/bean.md | 25 ++----------------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/console/commands/bean.go b/console/commands/bean.go index 23203ba..e1e7da1 100644 --- a/console/commands/bean.go +++ b/console/commands/bean.go @@ -97,7 +97,7 @@ func (BeanCommand) Execute(input command.Input) { for _, k := range keys { goType := fileParser.Types[k] for _, attr := range goType.Attrs { - if attr.HasTag("inject") { + if attr.HasTag("inject") || attr.HasTag("impl") { // 只收集使用到的 import bc.imports[fileParser.Imports[attr.TypeAlias]] = attr.TypeAlias } @@ -195,6 +195,13 @@ func genProvider(bc beanCache, m map[string]string) string { if tagName == "inject" { str = str + "\n\t\t" + sVar + "." + attrName + " = " + pointer + getInitializeNewFunName(attr, m) + } else if tagName == "impl" { + // 使用接口 接收注入 + tmp := getInitializeNewFunName(attr, m) + tmp = strings.ReplaceAll(tmp, "*", "") + + str = str + "\n\t\t" + + sVar + "." + attrName + " = " + tmp } } } @@ -231,6 +238,10 @@ func getInitializeNewFunName(k parser.GoTypeAttr, m map[string]string) string { name = name[1:] } tag := k.Tag["inject"] + if tag == "" { + tag = k.Tag["impl"] + } + if tag == "" { return alias + genInitializeNewStr(name) + "()" } else { diff --git a/docs/bean.md b/docs/bean.md index 9534b52..abcd3b9 100644 --- a/docs/bean.md +++ b/docs/bean.md @@ -59,36 +59,15 @@ func (receiver DemoBean) Exit () { ### 接口注入 -当前为了快速解析语法树, 没有做挎包读取的功能, 无法识别接口定义, 所以需要手动编写代码, 去支持注入 - ~~~~go type FromB interface { B() } // 注入 b 实现, 是不能直接支持的, 需要提前 NewB() 进行b注册到全局容器。 -// 这里不要写Bean注解, 否则会报错 -// 这种方式支持循环依赖 +// @Bean type GetB struct { - b FromB `inject:"b"` -} - -var _GetBSingle *GetB - -// 手动编写代码, 去支持注入 -func NewGetB() *GetB { - if _GetBSingle == nil { - _GetBSingle = &GetB{} - _GetBSingle.b = func() FromB { - var temp = providers.GetBean("b") - if bean, ok := temp.(providers.Bean); ok { - return bean.GetBean("").(FromB) - } - return temp.(FromB) - }() - providers.AfterProvider(_GetBSingle, "a") - } - return _GetBSingle + b FromB `impl:"b"` } ~~~~ \ No newline at end of file