h5手机网站源码下载,修改wordpress模板,个人网站做贷款广告,中信建设有限责任公司西安分公司背景
Arthas 是Alibaba开源的Java诊断工具#xff0c;深受开发者喜爱。
https://github.com/alibaba/arthas
Arthas提供了非常丰富的关于调用拦截的命令#xff0c;比如 trace/watch/monitor/tt 。但是很多时候我们在排查问题时#xff0c;需要更多的线索#xff0c;并不…背景
Arthas 是Alibaba开源的Java诊断工具深受开发者喜爱。
https://github.com/alibaba/arthas
Arthas提供了非常丰富的关于调用拦截的命令比如 trace/watch/monitor/tt 。但是很多时候我们在排查问题时需要更多的线索并不只是函数的参数和返回值。 比如在一个spring应用里想获取到spring context里的其它bean。如果能随意获取到spring bean那就可以“为所欲为”了。
下面介绍如何利用Arthas获取到spring context。
Demo https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot
Arthas快速开始https://alibaba.github.io/arthas/quick-start.html
使用tt命令获取到spring context
Demo是一个spring mvc应用请求会经过一系列的spring bean处理那么我们可以在spring mvc的类里拦截到一些请求。
启动Demo mvn spring-boot:run
使用Arthas Attach成功之后执行tt命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod的请求
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
然后访问一个网页 http://localhost:8080/
可以看到Arthas会拦截到这个调用index是1000并且打印出
$ watch com.example.demo.Test * params[0]sss
$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
Press CtrlC to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 101 ms.INDEX TIMESTAMP COST(ms IS-RE IS-EX OBJECT CLASS METHOD) T P
------------------------------------------------------------------------------------------------------------------1000 2019-01-27 16:31 3.66744 true false 0x4465cf70 RequestMappingHandlerAda invokeHandlerMethod:54 pter
那么怎样获取到spring context
可以用tt命令的-i参数来指定index并且用-w参数来执行ognl表达式来获取spring context
$ tt -i 1000 -w target.getApplicationContext()
AnnotationConfigEmbeddedWebApplicationContext[readerAnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader35dc90ec],scannerClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner72078a14],annotatedClassesnull,basePackagesnull,
]
Affect(row-cnt:1) cost in 7 ms.
从spring context里获取任意bean
获取到spring context之后就可以获取到任意的bean了比如获取到helloWorldService并调用getHelloMessage()函数
$ tt -i 1000 -w target.getApplicationContext().getBean(helloWorldService).getHelloMessage()
String[Hello World]
Affect(row-cnt:1) cost in 5 ms.
更多的思路
在很多代码里都有static函数或者static holder类顺滕摸瓜可以获取很多其它的对象。比如在Dubbo里通过SpringExtensionFactory获取spring context
$ ognl #contextcom.alibaba.dubbo.config.spring.extension.SpringExtensionFactorycontexts.iterator.next,
#context.getBean(userServiceImpl).findUser(1)
User[idInteger[1],nameString[Deanna Borer],
] 原文链接 本文为云栖社区原创内容未经允许不得转载。