springboot-内置tomcat
来源:互联网 发布:截取在线视频片段软件 编辑:程序博客网 时间:2024/05/17 05:16
跟踪springboot自启动tomcat
工作需要修改内置tomcat连接参数,将自己分析前后分享。 springboot 内置tomcat,tomcat为自动开启的配置,进入@SpringBootApplication注解。
//@SpringBootApplication注解源码@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration //开启自启动程序@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication {
//@EnableAutoConfiguration 注解源码@SuppressWarnings("deprecation")@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class) //加载需要自启动的配置文件public @interface EnableAutoConfiguration {
springboot原理,就是使用SpingFactoriesLoader.loadFactoryNames 扫描具有META-INFO/spring.factories文件的jar包 。 加载容器的配置文件 EmbeddedServletContainerAutoConfiguration,在配置文件中,内置tomcat(满足tomcat容器条件的bean存在),只要满足Jetty、Undertow的条件,可以切换为其他容器。
//EmbeddedServletContainerAutoConfiguration 源码@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)@Configuration@ConditionalOnWebApplication@Import(BeanPostProcessorsRegistrar.class)public class EmbeddedServletContainerAutoConfiguration { /** * Nested configuration if Tomcat is being used. */ @Configuration //tomcat启动条件(springboot内置存在) @ConditionalOnClass({ Servlet.class, Tomcat.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedTomcat { @Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() { return new TomcatEmbeddedServletContainerFactory(); } } /** * Nested configuration if Jetty is being used. */ @Configuration //jetty启动条件 :导入相应的pom文件即可 @ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedJetty { @Bean public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() { return new JettyEmbeddedServletContainerFactory(); } } /** * Nested configuration if Undertow is being used. */ @Configuration //Undertow 启动条件 @ConditionalOnClass({ Servlet.class, Undertow.class, SslClientAuthMode.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedUndertow { @Bean public UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() { return new UndertowEmbeddedServletContainerFactory(); } }
以tomcat为例,继续看如何加载并配置servlet容器 TomcatEmbeddedServletContainerFactory 获取容器
@Overridepublic EmbeddedServletContainer getEmbeddedServletContainer( ServletContextInitializer... initializers) { Tomcat tomcat = new Tomcat(); File baseDir = (this.baseDirectory != null ? this.baseDirectory : createTempDir("tomcat")); tomcat.setBaseDir(baseDir.getAbsolutePath()); //通过nio1连接 org.apache.coyote.http11.Http11NioProtocol Connector connector = new Connector(this.protocol); tomcat.getService().addConnector(connector); customizeConnector(connector); //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 getTomcatEmbeddedServletContainer(tomcat);}
继续跟踪查看customizeConnector(connector); 查看此方法源码 所以有两种方式可以实现个性化的connector 1.继承 TomcatEmbeddedServletContainerFactory 重写此方法,加入个性化配置 2.实现TomcatConnectorCustomizer 接口,将实现类加入到TomcatEmbeddedServletContainerFactory
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) { customizer.customize(connector); //个性化配置的主要接口}
//添加个性化connector类 TomcatConnectorCustomizerpublic void addConnectorCustomizers( TomcatConnectorCustomizer... tomcatConnectorCustomizers) { Assert.notNull(tomcatConnectorCustomizers, "TomcatConnectorCustomizers must not be null"); this.tomcatConnectorCustomizers.addAll(Arrays.asList(tomcatConnectorCustomizers));}
TomcatConnectorCustomizer 自定义个性化connector(实现此类后,将实现类接入到factory中即可)
public interface TomcatConnectorCustomizer { /** * Customize the connector. * @param connector the connector to customize */ void customize(Connector connector);}
0 1
- springboot-内置tomcat
- springBoot修改内置tomcat端口
- springboot之修改内置tomcat配置项
- SpringBoot系列<二>指定内置tomcat版本
- springboot内置tomcat修改配置项
- 【SrpingBoot】SpringBoot内置Tomcat报错+除错小技巧
- springboot 修改内置端口
- springBoot项目打jar包发布时启动包内置tomcat无法启动错误分析
- Springboot内置Tomcat版本导致的“The valid characters are defined in RFC 7230 and RFC 3986”错误
- springBoot tomcat启动
- springboot项目 部署tomcat
- java-springboot-tomcat 搭建
- java-springboot-tomcat 搭建
- springboot+maven+tomcat问题
- SpringBoot外置tomcat
- Springboot+Maven+Tomcat部署
- Tomcat内置数据源
- tomcat 内置启动
- 基于HTML5 FileReader创建图片上传预览图
- 设计模式之策略模式
- 开发OBS实录
- c#执行异步操作
- thInkphp 写入文件
- springboot-内置tomcat
- 基于TV模型的image inpainting算法
- 全排列延伸编程题目
- HttpCallUtil
- 发现一个不错的博客
- 第三章:字符串、向量和数组
- 线段树--区间合并hdu--1540
- JavaScript的执行上下文(与上下文不同,此点常被混淆)
- 人脸检测中误检漏检