皮皮网

【mean shift源码】【思途源码cms】【源码快速阅读】spring dispatcher源码

2024-12-24 12:51:57 来源:etcd源码多少行

1.jetty、源码tomcat源码解读?源码
2.头秃了,二十三张图带你从源码了解SpringBoot启动流程!源码
3.SpringMVC4中RequestMappingHandlerAdapter为什么被创建了两个
4.springMVC中Dispatcher中的/和/*的区别
5.mybatis返回boolean值时数据库返回null

spring dispatcher源码

jetty、源码tomcat源码解读?源码

       我们部署Web服务在Tomcat服务器中,探讨了从HTTP请求到springmvc组件中DispatcherServlet的源码mean shift源码访问路径。

       Tomcat核心组件详解

       在Tomcat体系中,源码Server组件作为整个服务器的源码管理核心,包含服务管理、源码端口监听等功能。源码每个Service组件则负责接收客户端消息与处理请求,源码包含多个连接器和一个容器。源码连接器负责网络连接,源码容器则用于处理请求与响应。源码连接器与容器之间通过标准的源码思途源码cmsServletRequest和ServletResponse进行通信。

       连接器Connector组件

       连接器实现了网络连接和应用层协议处理,设计了EndPoint、Processor和Adapter三个组件,它们之间通过抽象接口交互,封装变化,提高复用性和降低耦合度。ProtocolHandler接口封装了网络通信和应用层协议解析,具体实现类如HttpNioProtocol和AjpNioProtocol对应不同的协议和通信模型。

       EndPoint

       EndPoint作为通信端点,实现Socket通信,是TCP/IP协议的抽象。在具体实现中,如NioEndpoint和Nio2Endpoint,包含Acceptor和SocketProcessor,源码快速阅读用于监听连接请求和处理Socket请求,SocketProcessor将请求提交到线程池Executor中。

       Processor

       Processor负责解析应用层协议,如HTTP/AJP,将Socket请求解析为Tomcat Request对象,并通过Adapter提交到容器处理。

       Adapter

       Adapter用于适配Tomcat Request与标准的ServletRequest,将Tomcat Request转换为可由容器处理的ServletRequest,调用容器的Service方法。

       Tomcat调用DispatcherServlet流程图

       在部署了Web服务的Tomcat服务器中,HTTP请求通过连接器到达Processor,进行协议解析,生成Tomcat Request。此请求通过Adapter转换为标准的微软adobe源码ServletRequest,传递给容器。容器按照配置加载Web应用,找到DispatcherServlet,启动服务。在DispatcherServlet中,请求流程进一步处理,实现业务逻辑,最终生成响应,通过Adapter和Processor返回给客户端。

头秃了,二十三张图带你从源码了解SpringBoot启动流程!

       源码版本

       作者使用的是Spring Boot的2.4.0版本。不同版本的Spring Boot可能存在差异,建议读者与作者保持一致,nettyio源码分析以确保源码的一致性。

       从哪入手

       Spring Boot源码的研究起点是主启动类,即标注着`@SpringBootApplication`注解并且包含`main()`方法的类。这是Spring Boot启动的核心。

       源码如何切分

       SpringApplication中的静态`run()`方法是一个复杂的流程,它分为两步:创建`SpringApplication`对象和执行`run()`方法。接下来将分别介绍这两部分。

       如何创建`SpringApplication`

       创建`SpringApplication`的过程本质上是一个对象的生成,通过调试追踪,最终调用的构造方法如图所示。创建过程主要涉及三个阶段,我们将逐一进行深入。

       设置应用类型

       创建过程中的重要步骤是确定应用类型,这将直接影响项目的性质,如Web应用或非Web应用。应用类型由WebApplicationType枚举类决定,加载特定类(如DispatcherServlet)来判断。

       设置初始化器

       初始化器(ApplicationContextInitializer)用于在IOC容器刷新之前进行初始化操作,例如ServletContextApplicationContextInitializer。获取初始化器的方式是从SpringApplication中的方法调用开始的,最终通过`#SpringFactoriesLoader.loadSpringFactories()`方法从类路径加载。

       设置监听器

       监听器(ApplicationListener)负责监听特定的事件(如IOC容器刷新或关闭)。在Spring Boot中,使用SpringApplicationEvent事件来扩展监听器概念,主要在启动过程中触发。获取监听器的方式与初始化器相同,从spring.factories文件中加载。

       总结

       SpringApplication的构建为`run()`方法的执行铺平了道路,关键步骤包括设置应用类型、初始化器和监听器。注意,初始化器和监听器需要在spring.factories文件中声明,才能在构建过程中加载,此时IOC容器尚未创建,即使注入到容器中也不会生效。

       执行`run()`方法

       在构建结束后,到了启动的阶段,`run()`方法将执行一系列操作,分为八个步骤进行详细解析。

       步骤1:获取并启动运行过程监听器

       SpringApplicationRunListener监听器用于监听应用程序的启动过程,通过调用方法从spring.factories文件中获取运行监听器实例,并执行特定事件的广播。

       步骤2:环境构建

       构建过程包括加载系统和自定义配置(如application.properties),并广播事件通知监听器。

       步骤3:创建IOC容器

       执行容器创建过程,根据应用类型选择容器类型,此步骤仅创建容器,未进行其他操作。

       步骤4:IOC容器的前置处理

       这一步是容器刷新前的准备工作,关键操作是将主启动类注入容器,为后续自动化配置奠定基础。

       步骤5:调用初始化器

       执行构建过程中设置的初始化器,加载自定义的初始化器实现。

       步骤6:加载启动类,注入容器

       将主启动类加载到IOC容器中,作为自动配置的入口。

       步骤7:两次事件广播

       这一步涉及两次事件广播,包括ApplicationContextInitializedEvent和ApplicationPreparedEvent。

       步骤8:刷新容器

       容器刷新由Spring框架完成,包括资源初始化、上下文广播器等。

       步骤9:IOC容器的后置处理

       这一步是容器刷新后的扩展操作,通常用于打印结束日志等。

       步骤:发出结束执行的事件

       使用EventPublishingRunListener广播ApplicationStartedEvent事件,允许在IOC容器中注入的监听器响应。

       步骤:执行Runners

       Spring Boot提供了两种Runner,即CommandLineRunner和ApplicationRunner,用于定制额外操作。

       总结

       Spring Boot启动流程相对简洁,通过八个步骤详细描述了从创建到执行的整个过程。理解run()方法的执行流程、事件、初始化器和监听器的执行时间点是关键。

SpringMVC4中RequestMappingHandlerAdapter为什么被创建了两个

       è¿™ä¸ªå¯èƒ½æ˜¯å› ä¸ºä½ åœ¨springmvc配置文件中,同时配置了<mvc:annotion-driven/>和

       RequestMappingHandlerAdapter的bean,所以最后springmvc上下文中就有了两个类型都为RequestMappingHandlerAdapter的bean,但两个不影响使用,因为它们其实是有优先级排序的(当DispatcherServlet初始化的时候会根据优先级排序)。在springmvc配置文件中,放在前面的优先级高。如果想改变自己添加的RequestMappingHandlerAdapter的bean的优先级,让它高。要么把它<mvc:annotion-driven/>后面;要么设置order属性,只要order属性小于Integer.MAX_VALUE,放的顺序就可以忽略,按order看优先级

springMVC中Dispatcher中的/和/*的区别

       1. 首先 / 这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配。

       2. 在springmvc中可以配置多个DispatcherServlet,比如: 配置多个DispatcherServlet有/和/*,先匹配的是/*这个

       3. 当配置相同的情况下,DispathcherServlet配置成/和/*的区别

       < 一 > / :使用/配置路径,直接访问到jsp,不经springDispatcherServlet

       < 二 > /*:配置/*路径,不能访问到多视图的jsp

       å½“我在客户端调用URL:/user/list然后返回user.jsp视图,当配置的是/:DispathcherServlet拿到这个请求然后返回对应的controller,然后通过Dispather Type通过Forward转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather没有拦截/user/user.jsp,因为此时你配置的是默认的/,就顺利的交给ModleAndView去处理显示了。

       å½“配置的是/*:DispathcherServlet拿到这个请求然后返回对应的controller,然后通过Dispather Type通过Forward转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather已经拦截/user/user.jsp,Dispatcher会把他当作Controller去匹配,没有匹配到就会报错误。

       ç»“论:在配置视图的时候尽量用/这种方式。

mybatis返回boolean值时数据库返回null

       Servlet.service() for servlet [springDispatcherServlet] in context with path [/ms] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Mapper method ‘com.ms.dao.AdminDao.checkLoginAdminInfo attempted to return null from a method with a primitive return type (boolean).] with root cause

       org.apache.ibatis.binding.BindingException: Mapper method ‘com.ms.dao.AdminDao.checkLoginAdminInfo attempted to return null from a method with a primitive return type (boolean).

       参考:

       /lw/article/details/

       /hbxtw/article/details/

       mybatis返回boolean值时数据库返回null

       标签:tailtypedmiminiboolbindingteddetailsisp