构建springboot项目的全栈地图

创作思路

当我从idea获取一个栈时,我想着如何把它格式打印

当我获得两个栈时,我可以单独打印,但是会有很多重复,切不好结合分析

当我结合两个栈时,我想着能结合无数的栈,结合是精髓,机械地结合毫无意义,一定要有机的结合,最终的理想是把整个项目的脉络全部显示出来,构建一张“全栈”地图

地图太大了,得有搜索能力,栈该如何搜索呢,我定义起点和终点,地图残片一旦拼凑起来就不应该有缝隙,你可以把起点和终点分别设在两个残片上,前提是逻辑上能到达

要想功能强大,必须支持多个终点和起点,多个起点和终点取交集会是怎样的结果呢?说实话,我没编码之前,我都想不出会是什么样子。为了显眼,得给终点打上标记

开始遇到递归时,是想设置一个最大递归层数,后来设置多少层都不满意,还是得设别出递归,打上标记

遇到重写也能正确打上标记

目前发现唯一缺陷,是由于copy的栈没有参数信息,不能正确识别重载

实现的功能

利用clion上debug过程中copy的栈信息作为输入,通过python3.9格式化打印,并分析栈。支持以下功能:

1.格式化打印栈

2.有机结合多个栈

3.可以通过设置多个起点和终点来过滤栈

4.能够正确识别递归和重写

5.支持简洁和复杂打印风格,用户可扩展打印风格

6.目前支持java和c,用户可扩展其他语言

效果展示

在springboot启动过程中的关键处源码打上断点,打印效果如下:

00-> refresh
    01-> refresh
        02-> refresh
            03-> invokeBeanFactoryPostProcessors
                04-> invokeBeanFactoryPostProcessors //beanfatory后置处理
                    05-> getBeanNamesForType
                        06-> doGetBeanNamesForType
                            07-> isTypeMatch
                                08-> getSingleton //三级缓存解决循环依赖
                                    09-> getObject【重写】
                                        10-> lambda$doGetBean$0
                                            11-> createBean
                                                12-> doCreateBean
                                                    13-> createBeanInstance //创建bean实例
                                                    13-> populateBean //属性赋值
                                                    13-> initializeBean
                                                        14-> invokeAwareMethods //执行Aware方法
                                                        14-> applyBeanPostProcessorsBeforeInitialization //bean初始化前执行后置处理器
                                                        14-> invokeInitMethods
                                                            15-> afterPropertiesSet
                                                                16-> get
                                                                    17-> getBean
                                                                        18-> getBean
                                                                            19-> doGetBean
                                                                                20-> getSingleton 【已在level 8打印】 //三级缓存解决循环依赖
                                                                            19-> doGetBean 【已在level 19打印】
                                                        14-> applyBeanPostProcessorsAfterInitialization //bean初始化后执行后置方法
                                                    13-> registerDisposableBeanIfNecessary //注册DisposableBean
                                    09-> getObject【重写】
                                        10-> lambda$doGetBean$0 【已在level 10打印】
                    05-> invokeBeanDefinitionRegistryPostProcessors
            03-> registerBeanPostProcessors
                04-> registerBeanPostProcessors
                    05-> getBean 【已在level 18打印】
            03-> finishBeanFactoryInitialization
                04-> preInstantiateSingletons
                    05-> getBean 【已在level 18打印】

代码实现

python代码

spacePerLevel: int = 4
with open('stack_record.txt', 'r', encoding='utf-8') as file:
    content = file.read()
# print(content)

def preProcessing(line: str) -> str:
    if line.strip().startswith('//') or line.strip() == '':
        return ''
    if language == 'c':
        return line
    elif language == 'java':
        me: str = line.split(':')[0].strip()
        lineNum: str = line.split(':')[1].strip().split(',')[0].strip()
        file: str = line.split(',')[1].strip().split(' ')[0].strip()
        comment: str = ''
        if line.find('//') != -1:
            comment = '//' + line.split('//')[1].strip()
        return me + ' ' + file + ':' + lineNum + comment
    else:
        print('暂时只支持c和java格式的栈')
        exit(0)

lineList: list[str] 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值