springboot 使用tomcat详解_springboot运行tomcat_小星向上
1.使用内嵌tomcat启动
创建tomcat对象设置端口设置Context设置servlet 和 路径2.spring中单独注册servlet和地址的映射关系
@Bean
public ServletRegistrationBean getServletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet);
bean.addUrlMappings("/self");
return bean;
}
tomcat启动肯定要注册项目的地址和servlet的映射如果spring中注册了ServletRegistrationBean 那肯定也要把用户注册的servlet也添加到tomcat
3.分析源码,springboot既然使用了tomcat, 那么上面几个步骤肯定都是要有的
AbstractApplicationContext.java
?
ServletWebServerApplicationContext.java
?
createWebServer()
?
ServletContextInitializer是函数式接口
getSelfInitializer(); 定义函数式接口的实现
?就把上面定义的函数式接口的实现进行传递,当调用函数式接口的方法的时候,就会调用上面定义的实现方法? -- 这里要明白,不然你后面不知道是怎么调用到这里来的
this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});
?
TomcatServletWebServerFactory.Java
this.prepareContext(tomcat.getHost(), initializers);
?
this.configureContext(context, initializersToUse);
?
TomcatStarter 注意 该类实现 ServletContainerInitializer ,这个是servlet-api的接口,tomcat启动会调用该实现类的onStartUp方法();
?
this.getTomcatWebServer(tomcat);启动tomcat的方法
?
?
?启动tomcat
?
启动之后,会调用到ServletContainerInitializer的实现类的onstartUp()方法中;上面说到了
最终会调用到ServletWebServerApplicationContext.Java 的selfInitialize的方法实现中
?
Iterator var2 = this.getServletContextInitializerBeans();该方法就会返回需要servlet初始化的bean对象集合
我打断点查看返回的beans
?
?创建了
ServletContextInitializerBeans对象
?
?记得我们最开始注册的bean叭,就是SerlvetRegistrationBean,这里就把beanFactory中类型为这个bean的所有对象进行保存
?所以,当我们这里调用onStartUp()时,就会进入到SerlvetRegistrationBean的方法中;
为啥这里方法的实现只有这两个呢,是因为SerlvetRegistrationBean继承RegistrationBean, 所以调用会调用父类的onstartUp(),也就是RegistrationBean的onstartUp()方法;
附上:类图
?进入RegistrationBean的方法中
?
RegistrationBean
String description = this.getDescription();返回servlet的名称,我们创建ServletRegistrationBean的时候 ????????1.构造方法中会传入Servlet对象 ????????2.调用对象方法配置url
this.register(description, servletContext);就是进行注册了
1.D registration = this.addRegistration(description, servletContext);
2.this.configure(registration);
?结束,当然我们的DispathcerServlet也是这样注册的奥
附上:? ?DispatcherServletRegistrationBean注册的过程
自己思考在哪里注册的:
? ? ? ?肯定实在某个地方进行注册的,不可能无故出现叭;
????????分析使用DispathcerServlet肯定是在springmvc中, 所以肯定是在spring.factories文件中配置了自动装配的类,在这个类中进行的注册
?spring.factories找到? DispatcherServletAutoConfiguration类
注册 DispatcherServletRegistrationBean,
那么你肯定又有疑问了, tomcat明明过滤的是SerlvetRegistrationBean类型,那DispatcherServletRegistrationBean可以吗?
-- 你是忘记继承了吗!只要DispatcherServletRegistrationBean继承SerlvetRegistrationBean不就可以了吗
?
相关文章
- FMS财务管理系统:报表与凭证集成_Doker 多克
- html事件_~那一刻~
- 能力评估网站_程序设计123
- 彻底搞懂JavaScript防抖与节流_艾编程前端技术
- 安卓电子名片管理器的设计与实现_安卓网页大作业
- Spring @Bean注解源码分析_xuguofeng2016
- 证明客户端发起HTTP请求后会进入TIME_WAIT状态并占用端口_不愿透露姓名的育龙先生
- day21【代码随想录】二叉树的层序遍历、二叉树的层序遍历|| 、二叉树的层平均值 、二叉树的锯齿形层序遍历 、二叉树的右视图 、N叉树的层序遍历_Bwy_1004
- Linux系统Initramfs机制_Aspiresky
- CleanMyMacX4.15好用吗?CleanMyMac X2023安全吗?_仙剑魔尊重楼
- 基于android的资源文件管理器_安卓网页大作业
- 计算摄影??风格迁移_Turned_MZ
- Java泛型的作用以及如何使用(继承、接口、方法、通配符) 附源码_Java灵均
- Python动态可视化Plotly_生活明朗,万物可爱,人间值得,未来可期
- 医疗挂号网站_计算机毕设程序
- Visual Studio配置c环境_时时勤拂拭.