博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码解析
阅读量:2779 次
发布时间:2019-05-13

本文共 8209 字,大约阅读时间需要 27 分钟。

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 {

...

}

 解析带注解的方法参数: 注解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处理不同请求:

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 omittedDisconnected from the target VM, address: '127.0.0.1:54832', transport: 'socket'Process finished with exit code 1

 

转载地址:http://mvfld.baihongyu.com/

你可能感兴趣的文章
iOS图形动画笔记
查看>>
ios人脸识别
查看>>
UIView animation常用用法
查看>>
CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)
查看>>
关键帧动画CAKeyframeAnimation,可以用它来控制图像的运动轨迹
查看>>
linux学习之vi编辑器常用命令
查看>>
UML建模之用例图
查看>>
UML建模之状态图
查看>>
UML建模之时序图
查看>>
白盒测试之语句覆盖
查看>>
linux学习之shell基础
查看>>
java 23种设计模式浅析
查看>>
UML与java
查看>>
java 23种设计模式的UML类结构
查看>>
StarUML: 插件加载失败的解决方法 (无法逆向工程)
查看>>
android获取手机内存使用情况
查看>>
android Matrix原理
查看>>
常用词汇
查看>>
Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
查看>>
Android高效加载大图、多图解决方案,有效避免程序OOM
查看>>