您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何用golang仿spring ioc/aop進(jìn)行掃描”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何用golang仿spring ioc/aop進(jìn)行掃描”吧!
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常用注解,使用golang編寫“基于注解的靜態(tài)代碼增強(qiáng)器/生成器”
配置: ComponentScan,Configuration, Bean
Bean聲明:Component, Service, Controller
Bean注入:Autowried
AOP注解:Before, After, Around, PointCut
Q:搞點(diǎn)啥?
A:掃描go代碼文件
Q:具體點(diǎn)?
A:遞歸掃描指定的目錄下所有g(shù)o代碼,并提取結(jié)構(gòu)體,字段,方法和注解信息
Q:什么思路?
A:
逐method,解析注解
逐field,解析注解
逐struct,解析注解
讀取go文件>解析package>解析import>解析struct列表>解析field列表>解析method列表
Q:如何解析?
A:讀取文本>清除注釋>逐行正則掃描
Q:清除注釋?
A:因?yàn)樽⑨尷锩婵梢詫懭魏螙|西,所以清除注釋后可以減少解析錯(cuò)誤的可能
Q:如何清除?
A:
LINE_COMMENT = '//' [^\r\n]*
PARA_COMMENT = '/' . '*/'
Q:掃描package?
A:PACKAGE = ‘package' SPACE+ \w+
Q:掃描import?
A:
SINGLE_IMPORT = 'import' SPACE+ PACKAGE_LITERAL
PACKAGE_LITERAL = (PACKAGE_ALIAS SPACE+)? "\w+(/\w+)*"
MULTI_IMPORT = 'import' SPACE+ '(\r\n' (SPACE* PACKAGE_LITERAL)+ '\r\n)'
Q:掃描struct?
A:
STRUCT_START = 'type' SPACE+ \w+ SPACE+ 'struct' SPACE+ '{'
STRUCT_END = '}'
Q:掃描field?
A:
STRUCT_FIELD = SPACE+ \w+ FIELD_TYPE
FIELD_TYPE = BASIC_TYPE | CUSTOM_TYPE | POINTER_TYPE | ARRAY_TYPE | MAP_TYPE
BASIC_TYPE = 'int' | 'string' | 'bool' | ’uint‘ | 'rune' | 'byte' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'float32' | 'float64'
CUSTOM_TYPE = (PACKAGE_ALIAS.)?\w+
POINTER_TYPE = '*' FIELD_TYPE
ARRAY_TYPE = '[]' FIELD_TYPE
MAP_TYPE = 'map[' FIELD_TYPE ']' FIELD_TYPE
Q:掃描method?
A:
METHOD_START = 'func' SPACE+ RECEIVER METHOD_ARGS METHOD_RETURNS? '{'
RECEIVER = '(' RECEIVER_VAR *? RECEIVER_TYPE ')'
RECEIVER_VAR = \w+
RECEIVER_TYPE = \w+
METHOD_ARGS = '(' SPACE* METHOD_ARG? (SPACE* ',' SPACE* METHOD_ARG)* ')'
METHOD_ARG = \w+ SPACE* FIELD_TYPE
RETURNS = SINGLE_RETURN | MULTI_RETURN
SINGLE_RETURN = FIELD_TYPE
METHOD_RETURNS = '(' SPACE* RETURN_ARG? (SPACE* ',' SPACE* RETURN_ARG)* ')'
RETURN_ARG = NAMED_RETURN_ARG | UNNAMED_RETURN_ARG
NAMED_RETURN_ARG = \w+ SPACE* FIELD_TYPE
UNNAMED_RETURN_ARG = FIELD_TYPE
Q:提取注解?
A:
ANNOTATION = '@' \w+ (SPACE+ ANNOTATION_ATTRIBUTE+)?
ANNOTATION_ATTRIBUTE = AA_KEY '=' AA_VALUE
AA_KEY = \w+
AA_VALUE = [^\w,]+
提取指定struct/field/method之前的連續(xù)注釋行
提取 '// @'開頭的注釋 認(rèn)為是注解行
提取具體注解
感謝各位的閱讀,以上就是“如何用golang仿spring ioc/aop進(jìn)行掃描”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何用golang仿spring ioc/aop進(jìn)行掃描這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。