SpringBoot系列:3.web启动流程简述
本⽂简要介绍下SpringBoot中,web项⽬启动时⼀些重要的流程:
SpringBoot中⽤于web的IOC容器启动流程
HTTP的url是如何和controller中的⽅法绑定的?
常⽤的web项⽬配置参数
SpringBoot中⽤于web的IOC容器启动流程
Spring的核⼼就是ApplicationContext,启动流程实际就是调⽤其⼦接⼝ConfigurableApplicationContext的refresh()⽅法。
在Spring中,有⼀个ConfigurableApplicationContext的实现类AbstractApplicationContext,该类中实现了refresh()的流程。SpringBoot默认提供的启动类都是它的⼦类。
默认情况下,web服务使⽤的就是AnnotationConfigServletWebServerApplicationContext,它的⽗类是ServletWebServerApplicationContext,也
是AbstractApplicationContext的间接⼦类。类之间的继承关系如下:
因此,对于web启动流程可以分析ServletWebServerApplicationContext的refresh(),⼀个简化的启动流程如下:
AbstractApplicationContext中实现的refresh()流程中,包含了两个⽅法onRefresh()和finishRefresh()。ServletWebServerApplicationContext就是通过重写这两个⽅法,实现了对web server的配置和启动。
来看下ServletWebServerApplicationContext的onRefresh()和finishRefresh()
onRefresh()中主要是根据配置信息,初始化web Server,默认使⽤的就是Tomcat,依赖tomcat-embe
d-core
设置之后,会继续IOC的启动流程,处理项⽬中的Bean
在refresh()的最后,会调⽤finishRefresh(),并启动Tomcat,这之后才可以正常处理http请求。
@Override
protected void onRefresh(){
try{
createWebServer();
}
catch(Throwable ex){
throw new ApplicationContextException("Unable to start web server", ex);
}
}
@Override
protected void finishRefresh(){
super.finishRefresh();
WebServer webServer =startWebServer();
session和application的区别if(webServer != null){
publishEvent(new ServletWebServerInitializedEvent(webServer,this));
}
}
HTTP的url是如何和controller中的⽅法绑定的?
当提供restful api时,通常会在Controller类上使⽤@RestController注解,绑定的⽅法就是在该注解的处理逻辑中。
简单说下spring中注解的实现原理
在Spring IOC注⼊流程中会在处理bean的不同阶段,依次调⽤⼀些接⼝的全部实现类,例如InitializingBean,BeanPostProcessor等。SpringBoot中的注解就是通过实现这些接⼝,在逻辑中判断bean是否持有指定注解,来对bean做特殊处理。
对@RestController等web注解的处理类主要是RequestMappingHandlerMapping,该类间接实现了InitializingBean接⼝,通过重
写afterPropertiesSet⽅法实现处理逻辑。
url和⽅法绑定的具体流程
下⾯主要看下RequestMappingHandlerMapping和其⽗类AbstractHandlerMethodMapping中对绑定逻辑的实现,主要函数调⽤流程如下:
可以看到,注册的⼤部分逻辑是在AbstractHandlerMethodMapping中,最终会把url和处理⽅法保存在⼀个Hashmap中。
下⾯对⽅法做简要说明:
RequestMappingHandlerMapping.afterPropertiesSet()
初始化配置,⼀些url解析器和解析规则。
AbstractHandlerMethodMapping.initHandlerMethods()和processCandidateBean()
从IOC的beans中,筛选出包含@RestController等注解的controller bean。
AbstractHandlerMethodMapping.detectHandlerMethods(Object handler)
检测controller bean,筛选出包含@PostMapping()或@GetMapping()等注解的⽅法。
ister(T mapping, Object handler, Method method)
初始化并将url和处理⽅法注册到istry成员中,实际是个Hashmap
通过这个过程完成了url和⽅法的映射,后续接到http请求后,就会根据映射把请求路由到对应的⽅法上。
常⽤的web项⽬配置参数
spring:
redis:
database:0
host: localhost
port:6379
session:
store-type: redis #session的存储⽅式,集部署时选择redis在集中共享session
timeout: 600s #session的过期时间
main:
web-application-type: servlet #web项⽬的类型,影响使⽤的ApplicationContext的实现类,⾮web项⽬可设置为:none
server:
tomcat:
max-connections:1024 #最⼤连接数
accesslog:
enabled:true #开启accesslog,默认是false,要设置为true才会记录accesslog
directory: /var/user-logs/service-logs #保存accesslog的路径
pattern: "%t [%I] %a %r %s (%D ms)" #记录每⾏log的格式
file-date-format: .yyyy-MM-dd-HH #log⽂件的划分,默认是每天⼀个⽂件,可加上HH设置为按⼩时分log⽂件port:8999 #服务启动端⼝
servlet:
context-path: /my-app #url统⼀前缀
session:
cookie:
name: myjsessionid #保存在cookies中的session的变量名称
以上内容属个⼈学习总结,如有不当之处,欢迎在评论中指正
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论