IT技术之家

首页 > Java

Java

springboot 使用tomcat详解_springboot运行tomcat_小星向上

发布时间:2023-11-28 21:55:25 Java 29次 标签:servlet spring java
这里要明白,不然你后面不知道是怎么调用到这里来的TomcatStarter 注意 该类实现 ServletContainerInitializer ,这个是servlet-api的接口,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() 

?

? this.getWebServerFactory(); 从spring容器中获取??ServletWebServerFactory类型的bean,我们这里注册的是? TomcatServletWebServerFactory?factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});会调用到tomcat的实现,记得这里的参数,很重要的
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不就可以了吗

?