本文简要介绍下SpringBoot中,web我的项目启动时一些重要的流程:

  • SpringBoot中用于web的IOC容器启动流程
  • HTTP的url是如何和controller中的办法绑定的?
  • 罕用的web我的项目配置参数

SpringBoot中用于web的IOC容器启动流程

Spring的外围就是ApplicationContext,启动流程理论就是调用其子接口ConfigurableApplicationContextrefresh()办法。

在Spring中,有一个ConfigurableApplicationContext的实现类AbstractApplicationContext,该类中实现了refresh()的流程。SpringBoot默认提供的启动类都是它的子类。

默认状况下,web服务应用的就是AnnotationConfigServletWebServerApplicationContext,它的父类是ServletWebServerApplicationContext,也是AbstractApplicationContext的间接子类。类之间的继承关系如下:

因而,对于web启动流程能够剖析ServletWebServerApplicationContextrefresh(),一个简化的启动流程如下:

AbstractApplicationContext中实现的refresh()流程中,蕴含了两个办法onRefresh()finishRefresh()

ServletWebServerApplicationContext就是通过重写这两个办法,实现了对web server的配置和启动。

来看下ServletWebServerApplicationContextonRefresh()finishRefresh()

  • onRefresh()中次要是依据配置信息,初始化web Server,默认应用的就是Tomcat,依赖tomcat-embed-core
  • 设置之后,会持续IOC的启动流程,解决我的项目中的Bean
  • refresh()的最初,会调用finishRefresh(),并启动Tomcat,这之后才能够失常解决http申请。
@Overrideprotected void onRefresh() {  super.onRefresh();  try {    createWebServer();  }  catch (Throwable ex) {    throw new ApplicationContextException("Unable to start web server", ex);  }}@Overrideprotected void finishRefresh() {  super.finishRefresh();  WebServer webServer = startWebServer();  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()等注解的办法。
  • AbstractHandlerMethodMapping.MappingRegistry.register(T mapping, Object handler, Method method)

    • 初始化并将url和解决办法注册到MappingRegistry.registry成员中,理论是个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我的项目可设置为:noneserver:  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的变量名称

以上内容属集体学习总结,如有不当之处,欢送在评论中斧正