1.jetty、源码tomcat源码解读?源码
2.头秃了,二十三张图带你从源码了解SpringBoot启动流程!源码
3.SpringMVC4ä¸RequestMappingHandlerAdapter为ä»ä¹è¢«å建äºä¸¤ä¸ª
4.springMVCä¸Dispatcherä¸ç/å/*çåºå«
5.mybatis返回boolean值时数据库返回null
jetty、源码tomcat源码解读?源码
我们部署Web服务在Tomcat服务器中,探讨了从HTTP请求到springmvc组件中DispatcherServlet的源码e语言源码大全访问路径。Tomcat核心组件详解
在Tomcat体系中,源码Server组件作为整个服务器的源码管理核心,包含服务管理、源码端口监听等功能。源码每个Service组件则负责接收客户端消息与处理请求,源码包含多个连接器和一个容器。源码连接器负责网络连接,源码容器则用于处理请求与响应。源码连接器与容器之间通过标准的源码智能插座app 源码ServletRequest和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转换为标准的jdk完整源码包ServletRequest,传递给容器。容器按照配置加载Web应用,找到DispatcherServlet,启动服务。在DispatcherServlet中,请求流程进一步处理,实现业务逻辑,最终生成响应,通过Adapter和Processor返回给客户端。头秃了,二十三张图带你从源码了解SpringBoot启动流程!
源码版本
作者使用的是Spring Boot的2.4.0版本。不同版本的Spring Boot可能存在差异,建议读者与作者保持一致,怎样用源码以确保源码的一致性。
从哪入手
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