Spring源码解析

doPost

 

javax.validation.constraints 
  isValid

invokeHandlerMethod

 

processRequest

 

WebServelet启动过程:

createWebServer

getWebServerFactory

初始化tomcat容器

@Override
	public WebServer getWebServer(ServletContextInitializer... initializers) {
		if (this.disableMBeanRegistry) {
			Registry.disableRegistry();
		}
		Tomcat tomcat = new Tomcat();
		File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
		tomcat.setBaseDir(baseDir.getAbsolutePath());
		Connector connector = new Connector(this.protocol);
		connector.setThrowOnFailure(true);
		tomcat.getService().addConnector(connector);
		customizeConnector(connector);
		tomcat.setConnector(connector);
		tomcat.getHost().setAutoDeploy(false);
		configureEngine(tomcat.getEngine());
		for (Connector additionalConnector : this.additionalTomcatConnectors) {
			tomcat.getService().addConnector(additionalConnector);
		}
		prepareContext(tomcat.getHost(), initializers);
		return getTomcatWebServer(tomcat);
	}
public class Tomcat {
    

...

}

Spring源码解析_第1张图片

 解析带注解的方法参数: 注解PathVariable的解析

@GetMapping(path = "/{id}/",produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity getObj(@PathVariable long id) {

        City obj = entityManager.find(City.class, id);
        return this.responseEntity.success(obj);
    }
通过PathVariableMethodArgumentResolver.supportsParameter解析参数id的注解PathVariable
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		if (!parameter.hasParameterAnnotation(PathVariable.class)) {
			return false;
		}
		if (Map.class.isAssignableFrom(parameter.nestedIfOptional().getNestedParameterType())) {
			PathVariable pathVariable = parameter.getParameterAnnotation(PathVariable.class);
			return (pathVariable != null && StringUtils.hasText(pathVariable.value()));
		}
		return true;
	}

以此类推,通过这个类的接口联想到其他的参数的XXXMethodArgumentResolver

解析出来的是id,提供给HttpServerletRequest.getHeader获取
 

HttpServlet.service根据method处理不同请求:

Spring源码解析_第2张图片

Servlet on Spring Boot

组件: 扫描 \ 注册 HttpServlet

filter: 扫描 \ 注册 Filter

listener: 扫描 \ 注册 XXXXListener

 

请求处理流程:

HttpServlet.doService-->FrameworkServlet.processRequest--->DispatcherServlet.doService--->

DispatcherServlet.doDispatch:

   mv = ha.handle(processedRequest, response, mappedHandler.getHandler());--->CityController.getObj

 

PropertyMapper

@Override
	public void customize(ConfigurableServletWebServerFactory factory) {
		PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
		map.from(this.serverProperties::getPort).to(factory::setPort);
		map.from(this.serverProperties::getAddress).to(factory::setAddress);
		map.from(this.serverProperties.getServlet()::getContextPath).to(factory::setContextPath);
		map.from(this.serverProperties.getServlet()::getApplicationDisplayName).to(factory::setDisplayName);
		map.from(this.serverProperties.getServlet()::getSession).to(factory::setSession);
		map.from(this.serverProperties::getSsl).to(factory::setSsl);
		map.from(this.serverProperties.getServlet()::getJsp).to(factory::setJsp);
		map.from(this.serverProperties::getCompression).to(factory::setCompression);
		map.from(this.serverProperties::getHttp2).to(factory::setHttp2);
		map.from(this.serverProperties::getServerHeader).to(factory::setServerHeader);
		map.from(this.serverProperties.getServlet()::getContextParameters).to(factory::setInitParameters);
	}

 

一次报错打印的stacktrace:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 
[2020-02-13 21:48:43.576]  [ERROR] 
org.springframework.boot.SpringApplication:826   Application run failed  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: ik.starriver.msgcenter.entity.Store.customers[ik.starriver.msgcenter.entity.Customer]     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)     at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)     at ik.starriver.msgcenter.MsgCenterApplication.main(MsgCenterApplication.java:43) Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: ik.starriver.msgcenter.entity.Store.customers[ik.starriver.msgcenter.entity.Customer]     at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1332)     at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:870)     at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:795)     at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53)     at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1684)     at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1652)     at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1202)     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1233)     at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)     ... 16 common frames omitted Disconnected from the target VM, address: '127.0.0.1:54832', transport: 'socket' Process finished with exit code 1

 

你可能感兴趣的:(spring)