首页 > 编程知识 正文

session和servlet,spring boot实战

时间:2023-05-06 08:16:10 阅读:27674 作者:4030

另一方面,嵌入式servlet容器切换嵌入式servlet容器默认支持的web服务器:Tomcat,Jetty,orundertowservletwebserverapplicationcontext容器

ependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-web/artifact id! -缺省情况下导入的Tomcat---- exclusionsexclusiongroupidorg.spring framework.boot/groupidartifactidspring-boot-startart

我知道Springboot的自动配置都是通过几个AutoConfiguration类进行自动配置的,所以同样,本博客也需要查找相应的类,然后进行servletwebserverfactoryautoconfiguration 简单说明一下其源代码, @ configuration (proxybeanmethods=false ) autoconfigureorder ) ordered.highest_precedence ) conditionaloncer @ condition bleconfigurationproperties (服务器属性. class )/启用服务器属性设置类@ import (servletwebserverfactoryautoconfiguration.beanpostprocessorsregistrar.class, servletwebserverfactoryconfiguration.embedded Tomcat.class,servletwebserverfactoryconfiguration.embedded jetty.class, servletwebserverfactoryconfiguration.embedded undertow.class }//@ import是Spring框架的注释,用于将相应的组件加载到容器中这里重要的是beanpostprocessorsssorss。后处理类publicclasservletwebserverfactoryautoconfiguration { @ beanpublicservletwebserverfactoration } rfactorrverfactor pertiesserverproperties (returnnewservletwebserverfactorycustomizer (服务器属性); }//Tomcat的定制器类可以在启用Tomcat的jar中有部署项目,作为工作条件。 Tomcat servlet web工厂定制类@ bean @ conditionalonclass (name=' org.Apache.catalina.startup.Tomcat,因为它是缺省部署的orycustomizertomcatservletwebserverfactorycustomizer {服务器属性} { reeverproperties } (//注册重要的后处理器类webserverfactorycustomizerbeanpostprocessor, ioc容器启动时后处理器publicstaticclassbeanpostprocessorsregistrarimplementsimportbeandefinitionregistrar, 将调用beanfactory aware { privatecoore }//configurablelistablebeanfactory @ overridepublicvoidsetbeanfactory (beanfactore

eListableBeanFactory) {this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;}}@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {if (this.beanFactory == null) {return;}registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",WebServerFactoryCustomizerBeanPostProcessor.class);registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor",ErrorPageRegistrarBeanPostProcessor.class);}private void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);beanDefinition.setSynthetic(true);registry.registerBeanDefinition(name, beanDefinition);}}}}

从自动配置类里,我们并不能很明确地理解自动配置是怎么运行的,只看重关键的一些信息点,比如注册了Tomcat的ServletWebServer工厂的定制器类,方法是tomcatServletWebServerFactoryCustomizer,还有一个后置处理类BeanPostProcessorsRegistrar,后置处理是Spring源码里是很关键的,所以这里可以继续点一下TomcatServletWebServerFactoryCustomizer,Tomcat的webServer工厂定制器类

也是一个WebServerFactoryCustomizer类型的类,这个类是进行servlet容器的一些定制

这个是关键的方法,主要是拿ServerProperties配置类里的信息进行特定属性定制

所以,这里就可以知道Tomcat的配置是通过定制器类TomcatServletWebServerFactoryCustomizer进行定制的,其工厂类是TomcatServletWebServerFactory

TomcatServletWebServerFactory工厂类进行Tomcat对象的创建,必要参数的自动配置

ok,简单跟了一下源码之后,我们知道了TomcatServletWebServerFactoryCustomizer是Tomcat的定制器类,Tomcat对象的创建是通过TomcatServletWebServerFactory类的,然后,有个疑问,这个定制器类是什么时候创建的?为什么一启动Application类,嵌入式的Tomcat也启动了?打成jar格式的Springboot项目,只要运行jar命令,不需要启动任何servlet容器,项目也是正常运行的?然后这个BeanPostProcessorsRegistrar后置处理类有什么作用?ok,带着这些疑问,我们还是用调试一下源码

如图,打断点调试,看看Tomcat定制器是怎么创建的?

定制器类被调用了,其对应的工厂类也会起作用,打个断点,看看工厂类是怎么调用的?

ok,启动Application类,在idea里调试,如图,可以跟着调用顺序,一点点跟源码,如图所示,调用了Springboot的run方法

run方法里的刷新上下文方法,refreshContext其实也就是创建ioc容器,初始化ioc容器,并创建容器的每一个组件

这里注意到了,调用到了ServletWebServerApplicationContext类的refresh方法,ServletWebServerApplicationContext类前面也介绍到了,这个类是一种特殊的ApplicationContext类,也就是一些ioc的上下文类,作用于WebServer类型的类

创建webServer类,先创建ioc容器,调用基类的onRefresh方法,然后再调用createWebServer方法

ioc的servletContext组件没被创建的情况,调用ServletWebServerFactory类获取WebServer类,有servletContext的情况,直接从ioc容器获取

扫描ioc容器里是否有对应的ServletWebServerFactory类,TomcatServletWebServerFactory是其中一种,通过调试,是有扫描到的,所以从ioc容器里将这个bean对应的信息封装到ServletWebServerFactory对象

接着是ioc容器创建bean的过程,这个一个比较复杂的过程,因为是单例的,所以是调用singleObjects进行存储

bean被创建之后,调用了后置处理器,这个其实就是Spring的源码里的bean的创建过程,后置处理器是很关键的,在bean被创建,还没进行属性赋值时候,就调用了后置处理器

关键点,这里是检测是否有WebServerFactory工厂类,前面的调试发现已经有Tomcat的WebServer工厂类,所以是会调用后置处理器的

调用了WebServerFactoryCustomizerBeanPostProcessor这个后置处理类,然后拿到一个WebServerFactoryCustomizer定制器类,也就是TomcatWebServerFactoryCustomizer,通过后置处理器调用定制方法customize

然后WebServerFactoryCustomizerBeanPostProcessor这个后置处理器是什么注册的?往前翻Springboot的自动配置类,在这里找到了WebServerFactoryCustomizerBeanPostProcessor的注册

ok,继续调试源码,BeanWrapperImpl创建bean实例

ok,Tomcat定制器类被调用了,是通过后置处理器调用的

然后就是之前跟过的定制方法customize执行:

Tomcat的WebServer工厂类创建Tomcat对象实例,进行属性配置,引擎设置等等

端口有设置就创建TomcatwebServer对象

TomcatWebServer启动Tomcat,如图代码所示:

ok,跟了源码,您是否有一个疑问?Tomcat的工厂类TomcatServletWebServerFactory是什么时候创建的?好的,返回前面配置类看看,如图,这里用import引入了EmbeddedTomcat类

ok,EmbeddedTomcat是一个内部的配置类,条件是有引入Tomcat对应的jar,就会自动创建工厂类,很显然,Springboot默认是有引入的

ok,经过源码比较简单的学习,思路就很清晰了,Springboot的ServletWebServerFactoryAutoConfiguration是嵌入式Servlet容器的自动配置类,这个类的主要作用是创建TomcatServletWebServerFactory工厂类,创建定制器类TomcatServletWebServerFactoryCustomizer,创建FilterRegistrationBean类,同时很关键的一步是注册后置处理器webServerFactoryCustomizerBeanPostProcessor,然后Springboot的Application类一启动,就会执行run方法,run经过一系列调用会通过ServletWebServerApplicationContext的onRefresh方法创建ioc容器,然后通过createWebServer方法,createWebServer方法会去ioc容器里扫描是否有对应的ServletWebServerFactory工厂类(TomcatServletWebServerFactory是其中一种),扫描得到,就会触发webServerFactoryCustomizerBeanPostProcessor后置处理器类,这个处理器类会获取TomcatServletWebServerFactoryCustomizer定制器,并调用customize方法进行定制,这时候工厂类起作用,调用getWebServer方法进行Tomcat属性配置和引擎设置等等,再创建TomcatWebServer启动Tomcat容器,ok,本博客只是简单跟一下嵌入式Tomcat容器的启动过程,可以看出Springboot的强大,还是基于Spring框架的,比如本文提到的后置处理器,以及bean工程创建bean实例的过程,都是通过Spring框架实现的。

二、总结 SpringBoot应用启动发现当前是Web应用。web场景包-导入tomcatweb应用会创建一个web版的ioc容器 ServletWebServerApplicationContextServletWebServerApplicationContext 启动的时候寻找 ServletWebServerFactory(Servlet 的web服务器工厂—> Servlet 的web服务器)SpringBoot底层默认有很多的WebServer工厂;TomcatServletWebServerFactory, JettyServletWebServerFactory, or UndertowServletWebServerFactory底层直接会有一个自动配置类。ServletWebServerFactoryAutoConfigurationServletWebServerFactoryAutoConfiguration导入了ServletWebServerFactoryConfiguration(配置类)ServletWebServerFactoryConfiguration 配置类 根据动态判断系统中到底导入了那个Web服务器的包。(默认是web-starter导入tomcat包),容器中就有 TomcatServletWebServerFactoryTomcatServletWebServerFactory 创建出Tomcat服务器并启动;TomcatWebServer 的构造器拥有初始化方法initialize—this.tomcat.start();内嵌服务器,就是手动把启动服务器的代码调用(tomcat核心jar包存在) 三、定制Servlet容器 实现 WebServerFactoryCustomizer 把配置文件的值和ServletWebServerFactory 进行绑定

修改配置文件 server.xxx

直接自定义 ConfigurableServletWebServerFactory

xxxxxCustomizer:定制化器,可以改变xxxx的默认规则

import org.springframework.boot.web.server.WebServerFactoryCustomizer;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.stereotype.Component;@Componentpublic class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); }}

部分转自

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。