溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用golang仿spring ioc/aop進(jìn)行掃描

發(fā)布時(shí)間:2021-10-14 09:49:17 來源:億速云 閱讀:317 作者:iii 欄目:編程語言

這篇文章主要講解了“如何用golang仿spring ioc/aop進(jìn)行掃描”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何用golang仿spring ioc/aop進(jìn)行掃描”吧!

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常用注解,使用golang編寫“基于注解的靜態(tài)代碼增強(qiáng)器/生成器”

    • 配置: ComponentScan,Configuration, Bean

    • Bean聲明:Component, Service, Controller

    • Bean注入:Autowried

    • AOP注解:Before, After, Around, PointCut

子目標(biāo)(Day 5)

  • Q:搞點(diǎn)啥?

  • A:掃描go代碼文件

  • Q:具體點(diǎn)?

  • A:遞歸掃描指定的目錄下所有g(shù)o代碼,并提取結(jié)構(gòu)體,字段,方法和注解信息

  • Q:什么思路?

  • A:





    1. 逐method,解析注解

    1. 逐field,解析注解

    1. 逐struct,解析注解

    1. 讀取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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI