這篇文章主要講解了“如何用golang仿spring ioc/aop進(jìn)行掃描”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何用golang仿spring ioc/aop進(jìn)行掃描”吧!
創(chuàng)新互聯(lián)公司網(wǎng)絡(luò)公司擁有十載的成都網(wǎng)站開(kāi)發(fā)建設(shè)經(jīng)驗(yàn),上1000家客戶(hù)的共同信賴(lài)。提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站開(kāi)發(fā)、網(wǎng)站定制、買(mǎi)友情鏈接、建網(wǎng)站、網(wǎng)站搭建、響應(yīng)式網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格,提供周到的售前咨詢(xún)和貼心的售后服務(wù)
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編寫(xiě)“基于注解的靜態(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:清除注釋?zhuān)?/p>
A:因?yàn)樽⑨尷锩婵梢詫?xiě)任何東西,所以清除注釋后可以減少解析錯(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ù)注釋行
提取 '// @'開(kāi)頭的注釋 認(rèn)為是注解行
提取具體注解
感謝各位的閱讀,以上就是“如何用golang仿spring ioc/aop進(jìn)行掃描”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何用golang仿spring ioc/aop進(jìn)行掃描這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!