手?jǐn)]golang 仿spring ioc/aop 之10 增強(qiáng)1
緣起
最近閱讀 [Spring Boot技術(shù)內(nèi)幕: 架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理] (朱智勝 , 2020.6)
本系列筆記擬采用golang練習(xí)之
Talk is cheap, show me the code.
Spring
Spring的主要特性:
1. 控制反轉(zhuǎn)(Inversion of Control, IoC)
2. 面向容器
3. 面向切面(AspectOriented Programming, AOP)
源碼gitee地址:
https://gitee.com/ioly/learning.gooop
原文鏈接:
https://my.oschina.net/ioly
目標(biāo)
- 參考spring boot常用注解桩撮,使用golang編寫“基于注解的靜態(tài)代碼增強(qiáng)器/生成器”
子目標(biāo)(Day 10)
- 代碼掃描差不多了端幼,接下來考慮如何增強(qiáng)
- Q:子目標(biāo)蝗茁?
- A:以最常用的@RestController注解為例西采,改造代碼實(shí)現(xiàn)ioc注入/aop鉤子,bean注冊(cè)婉烟,gin整合
- Q:具體于微?
- A:一種功能增強(qiáng)會(huì)涉及到一族相關(guān)注解芽隆,比如RestController通常涉及RequestMapping, GetMapping和PostMapping。而幾乎所有的Bean都會(huì)用到Autowired崖瞭。
- Q:如何實(shí)現(xiàn)狂巢,組織和擴(kuò)展?
- A:凡擴(kuò)展必對(duì)應(yīng)鏈?zhǔn)?表式結(jié)構(gòu)书聚。系統(tǒng)將定義增強(qiáng)器接口唧领,以及多個(gè)增強(qiáng)器的實(shí)現(xiàn)。每種增強(qiáng)器識(shí)別一個(gè)核心注解(如RestController)及其相關(guān)注解(如GetMapping)雌续,并添加相關(guān)代碼到代碼模型中斩个。
- Q:誰來運(yùn)行和調(diào)用這些增強(qiáng)器?
- A:本來想著做成standlone app驯杜,現(xiàn)在看來受啥,直接在項(xiàng)目中集成增強(qiáng)器的包,寫個(gè)xx_test.go并運(yùn)行可能更方便鸽心。
- Q:難點(diǎn)是什么滚局?
- A:毫無疑問,Autowired是關(guān)鍵顽频。在什么范圍藤肢,如何匹配Implementation,循環(huán)依賴糯景,以及合適的初始化谤草。
- Q:如何折衷跟束?
- A:答案幾乎總是簡(jiǎn)化問題模型。
- Q:如何開始丑孩?
- A:第一步冀宴,是給所有代碼模型添加Clone()方法,為增強(qiáng)器提供材料温学。
domain/IClonable.go
克侣灾(深度拷貝)接口
package domain
type IClonable interface {
Clone() interface{}
}
domain/StructInfo.go
所有代碼模型實(shí)現(xiàn)IClonable接口,這里以StructInfo為例仗岖。
func (me *StructInfo) Clone() interface{} {
it := new(StructInfo)
it.CodeFile = me.CodeFile
it.LineNO = me.LineNO
it.Name = me.Name
it.Fields = make([]*FieldInfo, len(me.Fields))
for i,v := range me.Fields {
it.Fields[i] = v.Clone().(*FieldInfo)
it.Fields[i].Struct = it
}
it.Methods = make([]*MethodInfo, len(me.Methods))
for i,v := range me.Methods {
it.Methods[i] = v.Clone().(*MethodInfo)
it.Methods[i].Struct = it
}
it.Annotations = make([]*AnnotationInfo, len(me.Annotations))
for i,v := range me.Annotations {
it.Annotations[i] = v.Clone().(*AnnotationInfo)
}
return it
}
(未完待續(xù))