您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“使用golang編寫基于注解的靜態(tài)代碼增強器/生成器的方法教程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“使用golang編寫基于注解的靜態(tài)代碼增強器/生成器的方法教程”吧
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
參考spring boot常用注解,使用golang編寫“基于注解的靜態(tài)代碼增強器/生成器”
代碼掃描差不多了,接下來考慮如何增強
Q:子目標?
A:以最常用的@RestController注解為例,改造代碼實現(xiàn)ioc注入/aop鉤子,bean注冊,gin整合
Q:具體?
A:一種功能增強會涉及到一族相關(guān)注解,比如RestController通常涉及RequestMapping, GetMapping和PostMapping。而幾乎所有的Bean都會用到Autowired。
Q:如何實現(xiàn),組織和擴展?
A:凡擴展必對應(yīng)鏈式/表式結(jié)構(gòu)。系統(tǒng)將定義增強器接口,以及多個增強器的實現(xiàn)。每種增強器識別一個核心注解(如RestController)及其相關(guān)注解(如GetMapping),并添加相關(guān)代碼到代碼模型中。
Q:誰來運行和調(diào)用這些增強器?
A:本來想著做成standlone app,現(xiàn)在看來,直接在項目中集成增強器的包,寫個xx_test.go并運行可能更方便。
Q:難點是什么?
A:毫無疑問,Autowired是關(guān)鍵。在什么范圍,如何匹配Implementation,循環(huán)依賴,以及合適的初始化。
Q:如何折衷?
A:答案幾乎總是簡化問題模型。
Q:如何開始?
A:第一步,是給所有代碼模型添加Clone()方法,為增強器提供材料。
克?。ㄉ疃瓤截悾┙涌?/p>
package domain type IClonable interface { Clone() interface{} }
所有代碼模型實現(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 }
到此,相信大家對“使用golang編寫基于注解的靜態(tài)代碼增強器/生成器的方法教程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。