1.springçç»ä»¶åä½ç¨(springclouç»ä»¶)
2.一个很有想法的源码开源项目rocket-api
3.requestmappinghandleradapter å¨åªä¸ªjarå
4.mimikatz源码分析-lsadump模块(注册表)
5.spring的编写流程(spring流程编排)
6.Simpleperf 翻译篇3-Android 应用分析
springçç»ä»¶åä½ç¨(springclouç»ä»¶)
ç®è¦è¯´æspringçä¸¤ä¸ªæ ¸å¿åè½åå ¶ä½ç¨
springæ¡æ¶æ¯ä¸ä¸ªè½»é级çå¼æºä»ä¼æ¡æ¶ï¼æ¯ä¸ä¸ªIOCåAOP容å¨ãå®æ¯ä½ä¾µå ¥å¼è®¾è®¡ï¼ç¬ç«äºåç§åºç¨æå¡å¨ï¼
ä¾èµæ³¨å ¥çç¹ç¹å°ç»ä»¶å ³ç³»éæåï¼éä½è¦å度
æ§å¶å转ï¼IOCï¼ï¼ç¨æ¥éä½ç¨åºä»£ç ä¹é´çè¦å度ï¼ä½¿æ´ä¸ªç¨åºä½ç³»ç»ææ´å çµæ´»ï¼åæ¶å°ç±»çå建åä¾èµå ³ç³»åå¨é ç½®æ件éï¼ç±é ç½®æä»¶æ³¨å ¥ï¼è¾¾å°æ¾è¦åçææã
DIï¼ä¾èµæ³¨å ¥ï¼
设å¼æ³¨å ¥ï¼åºå±å®ç°setæ¹æ³èµå¼ã
使ç¨æé å¨æ³¨å ¥ï¼ç½©å³åºå±å®ç°æé æ¹æ³æ³¨å ¥ï¼æ ¹æ®beanä¸çåæ°ç±»åååæ°æ°éï¼å¯»æ¾å¯¹åºçæé æ¹æ³ã
èªå¨è£ é ï¼ä¸è½èªå¨è£ é æè°çç®åç±»åå æ¬åºæ¬ç±»åï¼å符串åéåç±»é常ç¨æ¥èªå¨è£ é 对象
æç §å称æ¥èªå¨è£ é åºå±å®ç°æ¯setæ¹æ³
æç §ç±»åæ¥èªå¨è£ é åºå±å®ç°æ¯setæ¹æ³
2.é¢ååé¢ç¼ç¨ï¼AOPï¼
æ主è¦çä½ç¨ï¼å¯ä»¥å¨ä¸ä¿®æ¹æºä»£ç çæ åµä¸ï¼ç»ç®æ æ¹æ³å¨ææ·»å åè½
ä¸å¡é»è¾å°±ä¸å¿çå¤çå®é éæ±ï¼éç¨çå¢å¼ºåè½ç¬ç«åºæ¥ãå°å®å ¨äºå¡çç¨åºé»è¾ç¸å¯¹ç¬ç«çåè½æ½ååºæ¥ï¼å©ç¨Springçé ç½®æ件å°è¿äºåè½æè¿å»ï¼å®ç°äºæç §åé¢ç¼ç¨ï¼æé«äºå¤ç¨æ§ã
åç§å¢å¼ºæ¹å¼ï¼
åç½®å¢å¼ºï¼å¨æ ¸å¿åè½ä¹åæ§è¡çé¢å¤åè½
åç½®å¢å¼ºï¼å¨æ ¸ç©ææ å¿åè½ä¹åæ§è¡çé¢å¤åè½
å¼å¸¸å¢å¼ºï¼å¨æ ¸å¿åè½åçå¼å¸¸æ¶æ§è¡çé¢å¤åè½
ç¯ç»å¢å¼ºï¼å¨æ ¸å¿åè½ä¹å以åä¹åæ§è¡çé¢å¤åè½
springå å«åªäºç»ä»¶
Springæ¡æ¶æ¯ä¸ä¸ªåå±æ¶æï¼ç±7个å®ä¹è¯å¥½ç模åç»æè¢å¤ãSpring模åæ建å¨æ ¸å¿å®¹å¨ä¹ä¸ï¼æ ¸å¿å®¹å¨ç«å®´å®ä¹äºå建ãé ç½®å管çbeançæ¹å¼ï¼ç»æSpringæ¡æ¶çæ¯ä¸ªæ¨¡åï¼æç»ä»¶ï¼é½å¯ä»¥åç¬åå纤æ¹å¨ï¼æè ä¸å ¶ä»ä¸ä¸ªæå¤ä¸ªæ¨¡åèåå®ç°ã
SpringMVC主è¦ç»ä»¶è¯´æ1ãå端æ§å¶å¨DispatcherServletï¼ä¸éè¦å¼åï¼ç±æ¡æ¶æä¾ãæ ¸å¿ãï¼
DispatcherServletæ¯SpringMVCçå ¥å£å½æ°ãæ¥æ¶è¯·æ±ï¼ååºç»æï¼ç¸å½äºè½¬åå¨ç¢§ç®ï¼ä¸å¤®å¤çå¨ãæäºDispatcherServletï¼å¯ä»¥å¤§å¤§åå°å ¶å®ç»ä»¶ä¹é´çè¦å度ã
ç¨æ·è¯·æ±å°è¾¾å端æ§å¶å¨ï¼å°±ç¸å½äºmvc模å¼ä¸çcï¼DispatcherServletæ¯æ´ä¸ªæµç¨æ§å¶çä¸å¿ï¼ç±å®è°ç¨å ¶å®ç»ä»¶æ¥å¤çç¨æ·ç请æ±ã
2ãå¤çå¨æ å°å¨HandlerMapping(ä¸éè¦å¼åï¼ç±æ¡æ¶æä¾)
HandlerMappingè´è´£æ ¹æ®ç¨æ·è¯·æ±ï¼URLï¼ï¼æ¾å°ç¸åºçHandlerå³å¤çå¨ï¼Controllerï¼ï¼SpringMVCæä¾äºä¸åæ å°å¨å®ç°çä¸åæ å°æ¹å¼ï¼ä¾å¦ï¼é ç½®æ件æ¹å¼ï¼å®ç°æ¥å£æ¹å¼ï¼æ³¨è§£æ¹å¼çã
3ãå¤çå¨éé å¨HandlerAdapter(ä¸éè¦å¼åï¼ç±æ¡æ¶æä¾)
æç §ç¹å®è§åï¼HandlerAdapterè¦æ±çè§åï¼å»æ§è¡Handlerï¼éè¿HandlerAdapter对å¤çå¨è¿è¡æ§è¡ï¼è¿æ¯éé å¨æ¨¡å¼çåºç¨ï¼éè¿æ©å±éé å¨å¯ä»¥å¯¹æ´å¤ç±»åçå¤çå¨è¿è¡å¤çã
4ãå¤çå¨Handler(éè¦å·¥ç¨å¸å¼å)
Handleræ¯ç»§DispatcherServletå端æ§å¶å¨çå端æ§å¶å¨ï¼å¨DispatcherServletçæ§å¶ä¸ï¼Handlerå¯¹å ·ä½çç¨æ·è¯·æ±è¿è¡å¤çãç±äºHandleræ¶åå°å ·ä½çç¨æ·ä¸å¡è¯·æ±ï¼æ以ä¸è¬æ åµä¸éè¦å·¥ç¨å¸æ ¹æ®ä¸å¡éæ±æ¥å¼åHandlerã
5ãè§å¾è§£æå¨ViewResolver(ä¸éè¦å¼åï¼ç±æ¡æ¶æä¾)
ä½ç¨ï¼è¿è¡è§å¾è§£æï¼æ ¹æ®é»è¾è§å¾å解ææçæ£çè§å¾ï¼Viewï¼ï¼ViewResolverè´è´£å°å¤çç»æçæViewè§å¾ãé¦å ï¼æ ¹æ®é»è¾è§å¾å解ææç©çè§å¾åï¼å³å ·ä½ç页é¢å°åï¼ï¼åçæViewè§å¾å¯¹è±¡ï¼æå对Viewè¿è¡æ¸²æï¼å°å¤çç»æéè¿é¡µé¢å±ç¤ºç»ç¨æ·ã
SpringMVCæ¡æ¶æä¾äºå¾å¤çViewè§å¾ç±»åï¼å æ¬ï¼jstlViewãfreemarkerViewãpdfViewçãä¸è¬æ åµä¸ï¼éè¦éè¿é¡µé¢æ ç¾æ页æ¸é®é¢æ¨¡çææ¯ï¼å°æ¨¡åæ°æ®éè¿é¡µé¢å±ç¤ºç»ç¨æ·ï¼è¿éè¦ç±å·¥ç¨å¸æ ¹æ®ä¸æ §å·§ä¸å¡éæ±å¼åå ·ä½ç页é¢ã
6ãè§å¾View(éè¦å·¥ç¨å¸å¼å)
Viewæ¯ä¸ä¸ªæ¥å£ï¼å®ç°ç±»æå¯ä»¥æ¯æä¸åçViewç±»åï¼jspãfreemarkerãpdf...ï¼
æ»ç»ï¼å¤çå¨Handlerï¼ä¹å°±æ¯å¹³å¸¸è¯´çControlleræ§å¶å¨ï¼ä»¥åè§å¾å±Viewï¼é½æ¯éè¦èªè¡å¼åçãå ¶ä»çä¸äºç»ä»¶ï¼å¦ï¼å端æ§å¶å¨DispatcherServletãå¤çå¨æ å°å¨HandlerMappingãå¤çå¨éé å¨HandlerAdapterçé½æ¯ç±æ¡æ¶æä¾ã
spring主è¦çä½ç¨ï¼Springæ¡æ¶æ¯ä¸ºäºè§£å³ä¼ä¸åºç¨å¼åçå¤ææ§èå建çã
Springçç¨éä¸ä» ä» éäºæå¡å¨ç«¯çå¼åãä»ç®åæ§ãå¯æµè¯æ§åæ¾è¦åæ§è§åº¦èè¨ï¼ç»å¤§é¨åJavaåºç¨é½å¯ä»¥ä»Springä¸åçã使ç¨åºæ¬çJavaBean代æ¿EJBï¼å¹¶æä¾äºæ´å¤çä¼ä¸åºç¨åè½ã
æ©å±èµæ
ä¼ç¹
1ãJAVAEEåºè¯¥æ´å 容æ使ç¨ã
2ãé¢å对象ç设计æ¯ä»»ä½å®ç°ææ¯ï¼æ¯å¦JAVAEEï¼é½éè¦ã
3ãé¢åæ¥å£ç¼ç¨ï¼èä¸æ¯é对类ç¼ç¨ãSpringå°ä½¿ç¨æ¥å£çå¤æ度éä½å°é¶ãï¼é¢åæ¥å£ç¼ç¨æåªäºå¤æ度ï¼
4ã代ç åºè¯¥æäºæµè¯ãSpringæ¡æ¶ä¼å¸®å©ä½ ï¼ä½¿ä»£ç çæµè¯å¤è¡¡æ´å ç®åã
5ãJavaBeanæä¾äºåºç¨ç¨åºé ç½®çæ好æ¹æ³ã
6ãå¨Javaä¸ï¼å·²æ£æ¥å¼å¸¸ï¼Checkedexceptionï¼è¢«è¿åº¦ä½¿ç¨ãæ¡æ¶ä¸åºè¯¥è¿«ä½¿ä½ ææ碧è·ä¸æè´ºåè½æ¢å¤çå¼å¸¸ã
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-springæ¡æ¶
一个很有想法的开源项目rocket-api
本文介绍了名为rocket-api的开源项目,其主要特性在于通过界面化定义语义碎片生成所需的分析访问代码,实现无需编写传统的源码Controller,VO,分析DAO层代码。源码初次接触可能稍显困惑,分析006溯源码但通过官网的源码教程和本地运行实践后,可以更深入理解其工作原理。分析
官网提供了快速部署指南,源码用户可以轻松搭建项目。分析值得注意的源码是,项目需要外置数据库以创建初始表,分析但不需要初始化数据,源码登录账号应与数据库账号相同。分析
官网文档中还展示了如何在1分钟内实现一个API接口,源码通过定义映射访问自定义脚本“select * from aaa”所查出的数据。API数据持久化存储,即使项目重启,仍可访问指定端点。有趣的是,虽然未在源码中见到类生成,但新增的映射能够通过访问运行。
火箭-api底层使用了Java 1.8后提供的ScriptEngineManager和Groovy引擎,实现动态编译。首次访问后生成Java类,后续调用直接运行,无需编译。这使得项目高效、灵活。
核心处理类QLRequestMappingFactory负责将API注册为request mapping,并解析入参和存储的执行脚本。requestMappingHandlerMapping是SpringBoot提供的方法,用于动态注册映射,适用于需要此类功能的eadsim源码项目。
执行脚本的方法默认使用Groovy引擎,输入框语法支持完全的Groovy语法,允许进行复杂的数据处理。对于想要尝试的用户,了解这些特性后,可以进一步探索如何通过Groovy语法实现更复杂的操作。
总结而言,火箭-api提供了一种新颖、高效的方式来构建API,通过简化代码生成和动态执行,提高了开发效率并增强了功能灵活性。通过深入学习其原理和使用方法,用户可以更充分地利用这一工具,实现自己的项目需求。
requestmappinghandleradapter å¨åªä¸ªjarå
DefaultAnnotationHandlerMappingï¼AnnotationMethodHandlerAdapterè¿ä¸¤ä¸ªç±»å¨springççæ¡æ¶æºç éé¢æé»è®¤ç设置ãå¦æä¸å¨é ç½®æ件æå®çè¯ï¼å½ä½ å¯å¨springæ¶ä¼è°ç¨é»è®¤çé£ä¸ªã
mimikatz源码分析-lsadump模块(注册表)
mimikatz是一款内网渗透中的强大工具,本文将深入分析其lsadump模块中的sam部分,探索如何从注册表获取用户哈希。
首先,简要了解一下Windows注册表hive文件的结构。hive文件结构类似于PE文件,包括文件头和多个节区,每个节区又有节区头和巢室。其中,巢箱由HBASE_BLOCK表示,巢室由BIN和CELL表示,整体结构被称为“储巢”。通过分析hive文件的结构图,可以更直观地理解其内部组织。
在解析过程中,需要关注的关键部分包括块的签名(regf)和节区的签名(hbin)。这些签名对于定位和解析注册表中的数据至关重要。
接下来,深入解析mimikatz的libnetcdf源码解析流程。在具备sam文件和system文件的情况下,主要分为以下步骤:获取注册表system的句柄、读取计算机名和解密密钥、获取注册表sam的句柄以及读取用户名和用户哈希。若无sam文件和system文件,mimikatz将直接通过官方API读取本地机器的注册表。
在mimikatz中,会定义几个关键结构体,包括用于标识操作的注册表对象和内容的结构体(PKULL_M_REGISTRY_HANDLE)以及注册表文件句柄结构体(HKULL_M_REGISTRY_HANDLE)。这些结构体包含了文件映射句柄、映射到调用进程地址空间的位置、巢箱的起始位置以及用于查找子键和子键值的键巢室。
在获取注册表“句柄”后,接下来的任务是获取计算机名和解密密钥。密钥位于HKLM\SYSTEM\ControlSet\Current\Control\LSA,通过查找键值,将其转换为四个字节的密钥数据。利用这个密钥数据,mimikatz能够解析出最终的密钥。
对于sam文件和system文件的操作,主要涉及文件映射到内存的过程,通过Windows API(CreateFileMapping和MapViewOfFile)实现。这些API使得mimikatz能够在不占用大量系统资源的情况下,方便地处理大文件。
在获取了注册表系统和sam的句柄后,mimikatz会进一步解析注册表以获取计算机名和密钥。对于密钥的获取,mimikatz通过遍历注册表项,定位到特定的键值,并通过转换宽字符为字节序列,最终组装出密钥数据。
接着,解析过程继续进行,devlxc 源码获取用户名和用户哈希。在解析sam键时,mimikatz首先会获取SID,然后遍历HKLM\SAM\Domains\Account\Users,解析获取用户名及其对应的哈希。解析流程涉及多个步骤,包括定位samKey、获取用户名和用户哈希,以及使用samKey解密哈希数据。
对于samKey的获取,mimikatz需要解密加密的数据,使用syskey作为解密密钥。解密过程根据加密算法(rc4或aes)有所不同,但在最终阶段,mimikatz会调用系统函数对数据进行解密,从而获取用户哈希。
在完成用户哈希的解析后,mimikatz还提供了一个额外的功能:获取SupplementalCreds。这个功能可以解析并解密获取对应用户的SupplementalCredentials属性,包括明文密码及哈希值,为用户提供更全面的哈希信息。
综上所述,mimikatz通过解析注册表,实现了从系统中获取用户哈希的高效功能,为内网渗透提供了强大的工具支持。通过深入理解其解析流程和关键结构体的定义,可以更好地掌握如何利用mimikatz进行深入的安全分析和取证工作。
spring的编写流程(spring流程编排)
springmvc工作流程
springmvc工作流程:
1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,logjs源码该请求该由哪个Controller来处理(并未调用Controller,只是得知)。
3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller。
4、HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet。
5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
6、DispatcherServlet将模型数据填充到视图中。
7、DispatcherServlet将结果响应给用户。
组件说明:
DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
HandlerMapping:处理器映射器,它根据用户访问的URL映射到对应的后端处理器Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图ModelAndView对象。
ViewResolver:视图解析器,将ModelAndView逻辑视图解析为具体的视图(如JSP)。
Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的Controller类。
spring工作流程
写得太笼统了,不过,spring+hibernate得基本工作流是分层得.
也许是:
reg页面是前台表单录入视图,提交后到RegController控制器,然后其中又封装了User和Reg得vo对象,在RegController中调用UserDAOImpl和RegImpl执行数据得保存,UserDAO是接口,UserDAOImpl实现了此接口.UserDAOImpl和RegImpl使用hibernate能力进行ROM映射,保存对象到数据库.regsuccess是保存数据成功后得返回视图.
spirngmvc需要配置控制器映射,将访问映射到控制器上,控制器调用dao或是services层得api执行业务逻辑,然后返回视图和模型对象给前置控制器,前置控制器根据返回得信息派发视图.
Spring启动流程(一)以java-config形式编写一个测试demo,新建一个AnnotationConfigApplicationContext,如果是XML形式使用ClassPathXmlApplicationContext;
两者都继承了AbstractApplicationContext类,详细看下面的层次图。
注意:在newAnnotationConfigApplicationContext()时如果未指定参数,会报运行时异常:org.springframework.context.annotation.AnnotationConfigApplicationContext@6ebca6hasnotbeenrefreshedyet
AnnotationConfigApplicationContext的有参构造执行了3个方法,分别是自己的无参构造、register()、refresh();
在描述前先从网上找了一个总体流程图方便了解一下大致流程,理清思路。
在执行AnnotationConfigApplicationContext的无参构造方法前会调用父类GenericApplicationContext的无参构造方法;
GenericApplicationContext中实例化一个DefaultListableBeanFactory,也就是说bean工厂实际上是应用上下文的一个属性;
从上面的类层次图可以看到:应用上下文和bean工厂又同时实现了BeanFactory接口。
前面讲到我们为了解IOC使用了Spring提供的AnnotationConfigApplicationContext作为入口展开,那Spring怎么对加了特定注解(如@Service、@Repository)的类进行读取转化成BeanDefinition对象呢?
又如何对指定的包目录进行扫描查找bean对象呢?
所以我们需要new一个注解配置读取器和一个路径扫描器。
AnnotatedBeanDefinitionReader中执行了AnnotationConfigUtils中的registerAnnotationConfigProcessors(this.registry)方法,会向容器注册Sprign内置的处理器。
registerAnnotationConfigProcessors方法中通过newRootBeanDefinition(XX.class)新建一个RootBeanDefinition(BeanDefinition的一个实现),然后调用registerPostProcessor将内置bean对应的BeanDefinition保存到bean工厂中;
这里需要说明的是:我们刚刚一直在谈到注册bean,实际上就是将内置bean对应的beanDefinition保存到bean工厂中。那为什么要保存beanDefinition呢?因为Spring是跟据beanDefinition中对bean的描述,来实例化对象的,就算自己定义的bean也是要被解析成一个beanDefinition并注册的。
其中最主要的组件便是ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor,前者是一个beanFactory后置处理器,用来完成bean的扫描与注入工作,后者是一个bean后置处理器,用来完成@AutoWired自动注入。
这个步骤主要是用来解析用户传入的Spring配置类,解析成一个BeanDefinition然后注册到容器中,主要源码如下:
通过生成AnnotatedGenericBeanDefinition,然后解析给BeanDefinition的其他属性赋值,然后将BeanDefinition和beanName封装成一个BeanDefinitionHolder对象注册到bean工厂中(就是将beanName与baenDefinition封装到Map中,将beanName放到list中。Map与list都是bean工厂DefaultListableBeanFactory所维护的属性),和前面内置bean的注册相同。
执行到这一步,register方法到此就结束了,通过断点观察BeanFactory中的beanDefinitionMap属性可以看出:this()和this.register(componentClasses)方法中就是将内置bean和我们传的配置bean的beanDefinition进行了注册,还没处理标记了@Component等注解的自定义bean。
Simpleperf 翻译篇3-Android 应用分析
准备一个 Android 应用
为了进行性能分析,可能需要调整构建脚本以生成专门的 APK 文件。针对 Android O(8.0)及以上版本,可以使用wrap.sh 脚本。步骤如下:在 AndroidManifest.xml 文件中添加 android::debuggable="true";在 lib/arch 目录下放置 wrap.sh。wrap.sh 在运行应用时,不向 ART 传递调试标志,使应用以发布版本运行。在 app/build.gradle 中加入wrap.sh脚本即可实现。
若需分析 C/C++ 代码,需注意Android Studio在构建 APK 时可能删除 Native 库的符号表和调试信息,导致分析结果中出现未知符号或损坏的调用图。解决方法是在app_profiler.py中使用-lib 参数,传递包含未剥离 Native 库的目录,通常是Android Studio项目路径。
对于 Java 代码的分析,从Android 9.0版本开始,Simpleperf 支持分析Java代码,不论执行方式。无需额外操作。
使用 SimpleperfExampleCpp 示例应用构建 app-debug.apk,用于性能分析。
记录和报告性能分析数据
通过app-profiler.py工具进行性能分析,收集当前目录下的perf.data文件中的分析数据以及binary_cache/目录下的相关Native二进制文件。分析时通常需要运行此应用,以确保记录到足够的样本。MixActivity启动繁忙线程,因此在分析时不需运行该应用。
使用report.py生成报告,输出到stdio接口。若报告中出现大量未知符号,参考相关文档。使用report_html.py生成html报告,并在浏览器中打开显示。
记录并报告调用图
通过HTML界面报告调用图,使用report_html.py展示性能分析结果,包括图表统计、样本表、火焰图、源代码注释和反汇编注释。推荐使用这种方式显示报告。
为了显示火焰图,首先记录调用图。火焰图展示在report_html.py的Flamegraph选项卡中,也可直接使用inferno显示。确保已安装perl。
使用FlameGraph构建火焰图,需要安装perl环境。
在Android Studio中报告
Simpleperf的report-sample命令将perf.data转换为Android Studio CPU Profiler识别的protobuf格式,转换可在设备端或主机端进行。使用--symdir参数在主机端执行操作,如果主机端有更多符号信息。
对Java符号进行反混淆
Java符号可能因ProGuard混淆。恢复报告中原始符号,通过--proguard-mapping-file参数将Proguard映射文件传递给报告脚本或report-sample命令。
同时记录On-CPU时间和Off-CPU时间
通过检查设备是否支持trace-offcpu属性实现。如果设备支持,可在属性列表中找到此属性,然后尝试使用。On-CPU时间表示线程在CPU上运行的总时间;Off-CPU时间则表示线程在I/O、锁、计时器、分页/交换等操作时,等待CPU时间。
分析应用启动
从应用启动阶段开始进行分析。
控制录制的应用程序代码
Simpleperf支持从应用代码控制录制。具体步骤如下:使用Demo实例演示。
手动解析分析数据
可以使用simpleperf_report_lib.py编写Python脚本手动解析分析数据。示例包括report_sample.py、report_html.py。
Spring MVC组件之HandlerMapping
HandlerMapping组件在Spring MVC中扮演着关键角色,它负责解析每个请求,并找到相应的处理器(Handler)进行处理。Handler通常指的是Controller控制器中的某个方法。
HandlerMapping组件执行两大核心任务:一是组件初始化时,将请求与对应的处理器进行注册,即在映射表中以键值对形式存储请求和处理器;二是解析请求,从映射表中查找相应的处理器。
HandlerMapping接口在Spring的源码中定义,其主要实现类分属两个系列:AbstractHandlerMethodMapping与AbstractUrlHandlerMapping。AbstractHandlerMethodMapping实现了HandlerMapping接口,而AbstractUrlHandlerMapping实现了MatchableHandlerMapping接口。
AbstractHandlerMapping是一个基础抽象类,其核心在于模板设计模式,允许子类覆盖特定方法实现业务逻辑。AbstractHandlerMapping继承自WebApplicationObjectSupport类,负责初始化上下文时,处理拦截器。
AbstractHandlerMethodMapping继承自AbstractHandlerMapping,实现InitializingBean接口,确保在实例化时,自动完成注册工作。其初始化注册逻辑主要在afterPropertiesSet方法中,通过循环遍历所有Bean,筛选出符合@Controller和@RequestMapping注解的处理器进行注册。
RequestMappingInfoHandlerMapping类重写getMatchingMapping方法,根据请求返回匹配的RequestMappingInfo对象,Spring MVC则据此获取对应的Handler。
RequestMappingHandlerMapping重写父类的afterPropertiesSet、isHandler和getMappingForMethod方法,分别负责初始化、过滤处理器以及创建RequestMappingInfo对象,用于请求与Handler映射。
AbstractUrlHandlerMapping系列专注于url与Handler之间的映射关系,首先存储映射,再通过url获取对应的处理器。AbstractUrlHandlerMapping实现MatchableHandlerMapping接口,包含match方法用于匹配。
HandlerMap的注册与查找逻辑在AbstractUrlHandlerMapping中实现,包括url与Handler的注册以及根据url查找对应Handler。lookupHandler方法通过url直接或使用PathPattern进行模式匹配,获取Handler并完成注册和校验。
BeanNameUrlHandlerMapping与SimpleUrlHandlerMapping分别通过Bean名称和Properties配置文件进行url与Handler的注册,简化了映射配置。
综上所述,HandlerMapping组件在Spring MVC架构中发挥着核心作用,通过高效地解析请求并匹配相应的处理器,保证了应用的响应速度与灵活性。