手撸golang仿springioc/aop之5如何扫描

ioly      2022-02-12     415

关键词:

手撸golang 仿spring ioc/aop 之5 如何扫描

缘起

最近阅读 [Spring Boot技术内幕: 架构设计与实现原理] (朱智胜 , 2020.6)
本系列笔记拟采用golang练习之
Talk is cheap, show me the code.

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. 读取go文件>解析package>解析import>解析struct列表>解析field列表>解析method列表
      1. 逐struct,解析注解
      1. 逐field,解析注解
      1. 逐method,解析注解
  • Q:如何解析?
  • A:读取文本>清除注释>逐行正则扫描
  • Q:清除注释?
  • A:因为注释里面可以写任何东西,所以清除注释后可以减少解析错误的可能
  • Q:如何清除?
  • A:

    • LINE_COMMENT = '//' 1*
    • 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:

    • 提取指定struct/field/method之前的连续注释行
    • 提取 '// @'开头的注释 认为是注解行
    • 提取具体注解

      • ANNOTATION = '@' \w+ (SPACE+ ANNOTATION_ATTRIBUTE+)?
      • ANNOTATION_ATTRIBUTE = AA_KEY '=' AA_VALUE
      • AA_KEY = \w+
      • AA_VALUE = 2+

(未完待续)


  1. \r\n ↩
  2. \w, ↩

手撸golang仿springioc/aop之12增强3

手撸golang仿springioc/aop之12增强3缘起最近阅读[SpringBoot技术内幕:架构设计与实现原理](朱智胜,2020.6)本系列笔记拟采用golang练习之Talkischeap,showmethecode.SpringSpring的主要特性:1.控制反转(InversionofControl,IoC)2.面向容器3.面向切面(Aspe... 查看详情

手撸golang学etcd手写raft协议之12单元测试

手撸golang学etcd手写raft协议之12单元测试缘起最近阅读[云原生分布式存储基石:etcd深入解析](杜军,2019.1)本系列笔记拟采用golang练习之raft分布式一致性算法分布式存储系统通常会通过维护多个副本来进行容错,以提高系统的可用... 查看详情

手撸golangspringioc/aop之2

手撸golangspringioc/aop之2缘起最近阅读[Offer来了:Java面试核心知识点精讲(框架篇)](王磊,2020.6)本系列笔记拟采用golang练习之Talkischeap,showmethecode.SpringSpring基于J2EE技术实现了一套轻量级的JavaWebService系统应用框架。它有很多优秀的... 查看详情

手撸golangetcdraft协议之11

手撸golangetcdraft协议之11缘起最近阅读[云原生分布式存储基石:etcd深入解析](杜军,2019.1)本系列笔记拟采用golang练习之raft分布式一致性算法分布式存储系统通常会通过维护多个副本来进行容错,以提高系统的可用性。这就引出了... 查看详情

手撸golangspringioc/aop之2

参考技术A手撸golangspringioc/aop之2最近阅读[Offer来了:Java面试核心知识点精讲(框架篇)](王磊,2020.6)本系列笔记拟采用golang练习之Talkischeap,showmethecode.配置接口指令接口指令构建器接口指令执行上下文接口保存配置另存配置添加... 查看详情

手撸golanggo与微服务chatserver之1

缘起最近阅读<<Go微服务实战>>(刘金亮,2021.1)本系列笔记拟采用golang练习之案例需求(聊天服务器)用户可以连接到服务器。用户可以设定自己的用户名。用户可以向服务器发送消息,同时服务器也会向其他用户广播该消息... 查看详情

手撸golanggo与微服务saga模式之1

缘起最近阅读<<Go微服务实战>>(刘金亮,2021.1)本系列笔记拟采用golang练习之Saga模式saga模式将分布式长事务切分为一系列独立短事务每个短事务是可通过补偿动作进行撤销的事务动作和补偿动作都是幂等的,允许重复执行而... 查看详情

手撸golanggo与微服务saga模式之7

缘起最近阅读<<Go微服务实战>>(刘金亮,2021.1)本系列笔记拟采用golang练习之Saga模式saga模式将分布式长事务切分为一系列独立短事务每个短事务是可通过补偿动作进行撤销的事务动作和补动作偿都是幂等的,允许重复执行而... 查看详情

手撸golang行为型设计模式模板方法模式

手撸golang行为型设计模式模板方法模式缘起最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔记拟采用golang练习之模板方法模式模板方法模式(TemplateMethodPattern)又叫作模板模式,指定义一个操作中的算... 查看详情

手撸golang基本数据结构与算法队列

手撸golang基本数据结构与算法队列缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之队列队列中的数据也呈线性排列。队列中添加和删除数据的操作分别是在两端进行的。就和... 查看详情

手撸golanggo与微服务chatserver之3压测与诊断

缘起最近阅读<<Go微服务实战>>(刘金亮,2021.1)本系列笔记拟采用golang练习之案例需求(聊天服务器)用户可以连接到服务器。用户可以设定自己的用户名。用户可以向服务器发送消息,同时服务器也会向其他用户广播该消息... 查看详情

手撸golang行为型设计模式访问者模式

手撸golang行为型设计模式访问者模式缘起最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔记拟采用golang练习之访问者模式访问者模式(VisitorPattern)是一种将数据结构与数据操作分离的设计模式,指封装... 查看详情

手撸golang基本数据结构与算法冒泡排序

缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之冒泡排序冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”这一操作的算法。... 查看详情

手撸golang基本数据结构与算法归并排序

缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之归并排序归并排序算法会把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子序列中只有一个数据时),... 查看详情

goroutine并发调度模型深度解析之手撸一个协程池(代码片段)

golanggoroutine协程池GroutinePool高并发并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是... 查看详情

手撸golang基本数据结构与算法网页排名/pagerank,随机游走

缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之网页排名(PageRank/佩奇排名),随机游走网页排名(PageRank,也叫作佩奇排名)是一种在搜索网页时对搜索结果进行排序的算法。... 查看详情

golang之array

golang使用array表示固定大小的数组,使用slice表示动态数组。packagemainimport"fmt"funcmain(){ vara=[5]int{2,3,5,7,11} fmt.Printf("typeofarray:%T ",a) fmt.Printf("addressofarray:%p ",&a) fmt.Printf("addressofarrar[0]:% 查看详情

golang之数组,切片

1.数组:同一种数据类型的固定长度的序列。2.数组定义:vara[len]int,例如:vara[5]int3.长度是数组类型的一部分,因此,vara[5]int和vara[10]int是不同的类型4.数组可以通过下标进行访问,下标是从0开始,最后一个元素是len-1for i:=... 查看详情