温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用golang仿spring ioc/aop进行扫描

发布时间:2021-10-14 09:49:17 来源:亿速云 阅读:317 作者:iii 栏目:编程语言

这篇文章主要讲解了“如何用golang仿spring ioc/aop进行扫描”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用golang仿spring ioc/aop进行扫描”吧!

Spring

Spring的主要特性:
1. 控制反转(Inversion of Control, IoC)
2. 面向容器
3. 面向切面(AspectOriented Programming, AOP)

源码gitee地址:
https://gitee.com/ioly/learning.gooop

原文链接:
https://my.oschina.net/ioly

目标

  • 参考spring常用注解,使用golang编写“基于注解的静态代码增强器/生成器”

    • 配置: ComponentScan,Configuration, Bean

    • Bean声明:Component, Service, Controller

    • Bean注入:Autowried

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

子目标(Day 5)

  • Q:搞点啥?

  • A:扫描go代码文件

  • Q:具体点?

  • A:递归扫描指定的目录下所有go代码,并提取结构体,字段,方法和注解信息

  • Q:什么思路?

  • A:





    1. 逐method,解析注解

    1. 逐field,解析注解

    1. 逐struct,解析注解

    1. 读取go文件>解析package>解析import>解析struct列表>解析field列表>解析method列表

  • Q:如何解析?

  • A:读取文本>清除注释>逐行正则扫描

  • Q:清除注释?

  • A:因为注释里面可以写任何东西,所以清除注释后可以减少解析错误的可能

  • 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之前的连续注释行

    • 提取 '// @'开头的注释 认为是注解行

    • 提取具体注解

感谢各位的阅读,以上就是“如何用golang仿spring ioc/aop进行扫描”的内容了,经过本文的学习后,相信大家对如何用golang仿spring ioc/aop进行扫描这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI