spring-boot如何得到一个tomcat实例(基于spring-boot_v2.0.6.RELEASE)

SpringBoot内置tomcat启动过程及原理 SpringBoot 的启动主要是通过实例化 SpringApplication 来启动的,启动过程主要做了如下几件事情:配置系统属性、获取监听器,发布应用开始启动事件、初始化参数、配置环境、创建应用上下文、预处理上下文、刷新上下文、再次刷新上下文、发布应用已经启动事件、发布应用启动完成事件。而启动 Tomcat 是刷新上下文 这一步。Spring Boot 创建 Tomcat 时,会先创建一个上下文,将 WebApplicationContext 传给 Tomcat; 阅读详情

        在上一篇博文spring-boot如何得到一个tomcat实例(基于spring-boot_v1.5.14.RELEASE)中我们介绍了基于spring-boot 1.5.14版本中tomcat的实例化过程,由于2.0版本之后这个实例化过程发生了很大的改变,所以本文将以2.0.6版本为基础介绍tomcat的实例化过程。(https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/)

   spring-boot加载tomcat的过程如下:

       (1) springboot的主函数有一个注解 @SpringBootApplication,而这个注解里有一个@EnableAutoConfiguration

@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 {

      (2) 相比于1.x版本,2.x版本废弃了自动配置类EmbeddedServletContainerAutoConfiguration,而使用了ServletWebServerFactoryAutoConfiguration和EmbeddedWebServerFactoryCustomizerAutoConfiguration两个自动配置类,下面我们分别来介绍一下这两个autoConfiguration

      (3) 我们先看一下比较简单的TomcatWebServerFactoryCustomizer吧

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(ServerProperties.class)
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {

   
	@Configuration
     //默认使用tomcat,因此条件满足
	@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class }) 
	public static class TomcatWebServerFactoryCustomizerConfiguration {
        
        // 实例化一个TomcatWebServerFactoryCustomizer实例bean,
        //这个bean实现了WebServerFactoryCustomizer接口,
        //它的customize方法负责对ConfigurableTomcatWebServerFactory进行配置
		@Bean
		public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(
				Environment environment, ServerProperties serverProperties) {
			return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
		}

	}

    // 由于 Server.class, Loader.class, WebAppContext.class 
    //默认情况下不存在,因此JettyWebServerFactoryCustomizerConfiguration不会生效
	@Configuration
	@ConditionalOnClass({ Server.class, Loader.class, WebAppContext.class })
	public static class JettyWebServerFactoryCustomizerConfiguration {

		@Bean
		public JettyWebServerFactoryCustomizer jettyWebServerFactoryCustomizer(
				Environment environment, ServerProperties serverProperties) {
			return new JettyWebServerFactoryCustomizer(environment, serverProperties);
		}

	}

    // 由于Undertow.class, SslClientAuthMode.class默认情况下不存在,
    // 因此UndertowWebServerFactoryCustomizerConfiguration不会生效
	@Configuration
	@ConditionalOnClass({ Undertow.class, SslClientAuthMode.class })
	public static class UndertowWebServerFactoryCustomizerConfiguration {

		@Bean
		public UndertowWebServerFactoryCustomizer undertowWebServerFactoryCustomizer(
				Environment environment, ServerProperties serverProperties) {
			return new UndertowWebServerFactoryCustomizer(environment, serverProperties);
		}
	}
}

     

    (4)然后看一下 ServletWebServerFactoryAutoConfiguration

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
		ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
		ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
		ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
    
    // 实例化一个 ServletWebServerFactoryCustomizer,它的泛型参数是ConfigurableServletWebServerFactory
	@Bean
	public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(
			ServerProperties serverProperties) {
		return new ServletWebServerFactoryCustomizer(serverProperties);
	}

   // 实例化一个TomcatServletWebServerFactoryCustomizer,它的泛型参数是TomcatServletWebServerFactory
	@Bean
	@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
	public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(
			ServerProperties serverProperties) {
		return new TomcatServletWebServerFactoryCustomizer(serverProperties);
	}


    // 通过上面的@import引入
	public static class BeanPostProcessorsRegistrar
			implements ImportBeanDefinitionRegistrar, BeanFactoryAware {

		private ConfigurableListableBeanFactory beanFactory;

		@Override
		public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
			if (beanFactory instanceof ConfigurableListableBeanFactory) {
				this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
			}
		}

		@Override
		public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
				BeanDefinitionRegistry registry) {
			if (this.beanFactory == null) {
				return;
			}
            //这边的处理跟v1.x版本是一致的, 
            //从beanFactory中获取一个WebServerFactoryCustomizerBeanPostProcessor实例bean,
            //如果不存在,则主动new一个
			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);
			}
		}

	}

}

         ServletWebServerFactoryAutoConfiguration 主要做了四件事:

  •  注1:通过@import引入ServletWebServerFactoryConfiguration的几个子类:EmbeddedTomcat、EmbeddedJetty和EmbeddedUndertow,而事实上最终只有EmbeddedTomcat起作用了,如下图,EmbeddedJetty和EmbeddedUndertow缺少依赖的java类,因此不会生效,而唯一生效的EmbeddedTomcat只做了一件事:实例化了一个TomcatServletWebServerFactory的bean,这个bean在 注4 会用到

  • 注2:实例化一个 ServletWebServerFactoryCustomizer的bean(它实现了WebServerFactoryCustomizer接口),它对ConfigurableServletWebServerFactory(它继承了WebServerFactory接口)进行配置
// ServletWebServerFactoryCustomizer实现了WebServerFactoryCustomizer接口
// ConfigurableServletWebServerFactory继承了WebServerFactory接口
// 之所以强调这些,因为在 注4 总会用到哦
public class ServletWebServerFactoryCustomizer implements
		WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {

	private final ServerProperties serverProperties;

	public ServletWebServerFactoryCustomizer(ServerProperties serverProperties) {
		this.serverProperties = serverProperties;
	}

	@Override
	public int getOrder() {
		return 0;
	}

	@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);
	}

 

  • 注3:实例化一个 TomcatServletWebServerFactoryCustomizer的bean,它对TomcatServletWebServerFactory(它是WebServerFactory的一个实现类)进行配置
// TomcatServletWebServerFactoryCustomizer实现了WebServerFactoryCustomizer接口
// TomcatServletWebServerFactory实现了WebServerFactory接口
// 在 注4 中会用到哦
public class TomcatServletWebServerFactoryCustomizer
		implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>, Ordered {

	private final ServerProperties serverProperties;

	public TomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {
		this.serverProperties = serverProperties;
	}

	@Override
	public int getOrder() {
		return 0;
	}

	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		ServerProperties.Tomcat tomcatProperties = this.serverProperties.getTomcat();
		if (!ObjectUtils.isEmpty(tomcatProperties.getAdditionalTldSkipPatterns())) {
			factory.getTldSkipPatterns()
					.addAll(tomcatProperties.getAdditionalTldSkipPatterns());
		}
		if (tomcatProperties.getRedirectContextRoot() != null) {
			customizeRedirectContextRoot(factory,
					tomcatProperties.getRedirectContextRoot());
		}
		if (tomcatProperties.getUseRelativeRedirects() != null) {
			customizeUseRelativeRedirects(factory,
					tomcatProperties.getUseRelativeRedirects());
		}
	}
  • 注4:通过@import引入BeanPostProcessorsRegistrar,进而通过BeanPostProcessorsRegistrar确保实例化一个WebServerFactoryCustomizerBeanPostProcessor实例bean,这个BeanPostProcessor的作用其实跟1.x版本中的EmbeddedServletContainerCustomizerBeanPostProcessor作用是一样的(摘抄部分源码如下),
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
        // 当bean是WebServerFactory的实例时则进行postProcessBeforeInitialization处理
        // 在注1中我们实例化了一个TomcatServletWebServerFactory,在这里可以派上用场了
        //都是实现或继承了webServerFactory
		if (bean instanceof WebServerFactory) {
			postProcessBeforeInitialization((WebServerFactory) bean);
		}
		return bean;
	}


	@SuppressWarnings("unchecked")
	private void postProcessBeforeInitialization(WebServerFactory webServerFactory) {
		   // 使用WebServerFactoryCustomizer的customize方法对webServerFactory进行配置,

           LambdaSafe
				.callbacks(WebServerFactoryCustomizer.class, getCustomizers(),
						webServerFactory)
				.withLogger(WebServerFactoryCustomizerBeanPostProcessor.class)
				.invoke((customizer) -> customizer.customize(webServerFactory));
	}

	private Collection<WebServerFactoryCustomizer<?>> getCustomizers() {
		if (this.customizers == null) {
			// Look up does not include the parent context
			this.customizers = new ArrayList<>(getWebServerFactoryCustomizerBeans());
            // 对所有的WebServerFactoryCustomizer按照Orderd进行排序
			this.customizers.sort(AnnotationAwareOrderComparator.INSTANCE);
			this.customizers = Collections.unmodifiableList(this.customizers);
		}
		return this.customizers;
	}

    // 从beanFactory中找到所有的WebServerFactoryCustomizer实例bean
    // 步骤(3)中 EmbeddedWebServerFactoryCustomizerAutoConfiguration
    //实例化了一个TomcatWebServerFactoryCustomizer的bean,
    //这个bean实现了WebServerFactoryCustomizer接口,
    // 在注2和注3中ServletWebServerFactoryAutoConfiguration实例化的 
    //ServletWebServerFactoryCustomizer和TomcatServletWebServerFactoryCustomizer
    //都实现了WebServerFactoryCustomizer接口,
   //因此在这里至少有3个我们已经知道的WebServerFactoryCustomizer可以在这里找到
	private Collection<WebServerFactoryCustomizer<?>> getWebServerFactoryCustomizerBeans() {
		return (Collection) this.beanFactory
				.getBeansOfType(WebServerFactoryCustomizer.class, false, false).values();
	}

 

         对于上面的 注1~ 注4,都出现了WebServerFactory或它的子类,我们可以用下面这张类图来阐述他们的关系:TomcatServletWebServerFactory实现了ConfigurableTomcatWebServerFactory接口,而ConfigurableTomcatWebServerFactory接口又继承了WebServerFactory接口

          

  (5) 跟1.x版本中的情况一样,以上步骤的主要目的就是实例化一个TomcatServletWebServerFactory,然后通过各个WebServerFactoryCustomizer对这个factory进行定制,最终得到一个完整的TomcatServletWebServerFactory,然后它的getWebServer方法就得到了一个tomcat实例,至此tomcat的实例过程讲解完毕。

     最后我们再总结一下对于spring-boot v1.x版本和v2.x版本,tomcat的实例化过程的具体区别

  •  WebServerFactoryCustomizerBeanPostProcessor替代了EmbeddedServletContainerCustomizerBeanPostProcessor
  •  WebServerFactory及其子类替代了ConfigurableEmbeddedServletContainer及其子类
  •  WebServerFactoryCustomizer及其子类替代了EmbeddedServletContainerCustomizer及其子类
  •  ServerProperties在2.x中只是一个普通的配置类,而在1.x中它比较复杂,如下图是它的类关系图,它还是EmbeddedServletContainerCustomizer的实现类,并且会作为一个默认实例化的bean起作用,在2.x中ServerProperties主要是作为各个Customizer的构造参数,然后在customize方法中使用。

 

 

Spring Cloud与Spring Boot版本匹配指南 微服务架构中,Spring Cloud作为基于Spring Boot的增强工具集,通过自动配置和starter依赖简化分布式系统开发。其核心原理是深度整合Spring Boot的机制,因此版本兼容性直接影响系统稳定性。当主要版本不匹配时,可能引发从功能缺失到运行时异常等各种问题。在实际工程实践中,服务注册中心、配置中心等关键组件对版本匹配尤为敏感。通过分析官方版本对应关系和典型组合案例,可以避免常见的兼容性问题,确保微服务架构平稳运行。掌握Spring Cloud与Spring Boot的版本管理策略,是构 阅读详情

相关推荐

spring boot实战(第一篇)第一个案例

spring boot实战(第一篇)第一个案例前言写在前面的话一直想将spring boot相关内容写成一个系列的博客,今天终于有时间开始了第一篇文章 以后有时间就会继续写下去。 spring boot 博客内容规划 spring boot 基本用法 自动配置 技术集成 性能监控 源码解析 spring boot 功能强大,后面会细细道来。第一个案例工程的构建构建spring boot工程一般采用两

liaokailin的专栏 6万+

spring-boot如何得到一个tomcat实例(基于spring-boot_v1.5.14.RELEASE)

       我们知道,springboot默认使用的是内嵌的tomcat作为web服务器,我们可以通过配置文件对tomcat的参数进行修改,比如server.port表示监听端口,server.contextPath表示上下文路径,server.tomcat.max-connections表示,完整配置可参考 https://docs.spring.io/spring-boot/docs/1.5...

小木公会 3150

别再复制粘贴了!手把手教你用腾讯云CentOS7.5部署Spring Boot项目(含MySQL8.0避坑指南)

本文详细介绍了在腾讯云CentOS7.5服务器上部署Spring Boot项目的完整流程,包括MySQL8.0的深度调优和常见避坑指南。从服务器初始化、环境配置到应用部署,提供实战解决方案,帮助开发者高效完成项目上线,特别适合需要部署Java项目的学生和初级开发者。

weixin_30859423的博客 320

spring boot项目运行jar包时如何获取Tomcat的访问日志

打war包的时候,只需要把war包放在外部Tomcat的webapps下,相关日志就可以直接在logs目录下看到,但是jar包如何获取呢,其实通过application设置文件,同样可以获取日志文件。

a7442358的专栏 1992

Linux Mint 21/22 美化 Mac 风格:WhiteSur 主题与 Dock 配置全指南

在 Linux 桌面环境中,GTK 主题与图标包是定制系统外观的核心技术,通过替换窗口边框、控件样式和图标资源,实现视觉风格的统一。其原理基于 GTK 引擎的样式解析与图标主题的索引机制,技术价值在于提升桌面美观度与操作一致性。典型应用场景包括将 Linux Mint 的 Cinnamon 桌面改造为 macOS 风格,涉及 WhiteSur 主题、Plank Dock 及全局菜单配置。本文围绕 Linux Mint 21/22 的美化需求,拆解主题、图标、光标、字体、Dock、顶栏六个模块,提供可复现的安

weixin_33892359的博客 1265

SpringBoot部署Tomcat示例

SpringBoot项目部署外部Tomcat容器简单示例,入门简单代码!

SpringCloud

SpringCloud微服务架构 常见的面试题? 1、什么是微服务? martinflow这个人提出了微服务的架构思想,是一种开发软件的架构,将应用程序构建为独立的组件,并将每个应用程序进程作为一项服务运行。这些服务使用轻量级 API 通过明确定义的接口进行通信。这些服务是围绕业务功能构建的,每项服务执行一项功能。由于它们是独立运行的,因此可以针对各项服务进行更新、部署和扩展,以满足对应用程序特定功能的需求。 2、微服务之间是如何进行通讯的? 3、SpringCloud和Dubbo? 4、SpringBoo

qq_53855503的博客 878

flink定位反压节点

在 Apache Flink 中定位反压(Backpressure)节点需要结合监控工具和作业行为分析。

2301_80954266的博客 1048

Spring容器中获取 Bean 实例的七种方式

点击关注公众号,利用碎片时间学习说明一、写作原因首先解释一下写这篇博文的原因,因为在使用spring框架的过程中获取bean是非常常见的操作,但是网上非常的博文大多承自一家之言,因此很多可操作性上并不强,本文是通过自己实战,亲自尝试之后提供的几种方案,供大家一起学习探讨。二、源码出处本文提供的测试代码为chapter-1-springmvc-quickstart中的单元测...

Java笔记虾 6350

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1036

目标检测数据集 第059期-基于yolo标注格式的水果李子检测数据集(含免费分享)

李子作为中国三大水果之一,种植历史超 3000 年,在市场中占据重要地位。传统李子种植、施肥、采摘依赖大量人力,存在资源浪费、产量估算不准、采摘时机难把控等问题。此前,农业领域缺乏针对 “未成熟李子” 的专用数据集,现有水果检测数据集多聚焦于成熟果实(如苹果、柑橘),且未覆盖李子种植的复杂自然场景。在使用该数据集进行学术研究时,应遵守相关的学术规范,引用该数据集的来源,尊重数据集创作者的劳动成果。,用于训练改进型模型,解决李子精准检测的核心痛点。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 773

Spring Boot 2.0中嵌入式Web容器(如Tomcat)对HTTP2的支持详解

Spring Boot应用往往作为服务发布,这里对HTTP2的支持,主要是对通过嵌入式Web容器支持HTTP2。 1. 在最新的Spring Boot 2.0.3.RELEASE中,集成的三种嵌入式Web容器及其版本如下: Tomcat 8.5.31  (Servlet 3.1) Undertow 1.4.25.Final(Servlet 3.1) Jetty 9.4.11.v201806...

成长的足迹 9854

芯片设计新思路:如何用SystemC+TLM2.0快速搭建ESL性能模型(附GEM5实战案例)

本文探讨了在芯片设计早期利用SystemC和TLM2.0标准快速构建电子系统级(ESL)性能模型的方法。通过对比不同抽象层次,详细介绍了如何搭建事务级模型,并与GEM5仿真平台协同,实现高效的架构探索和性能评估。文章最后通过一个片上网络(NoC)带宽优化的实战案例,展示了该方法如何驱动数据驱动的设计决策,从而在流片前规避风险、优化芯片性能。

fire9的博客 371

Spring Boot (2.1.6.RELEASE)- 概述

什么使Spring Boot? Spring Boot可以轻松创建独立的、可运行的、基于Spring的生产级应用程序。Spring Boot对Spirng和第三方平台进行了一些独到的配置,大多数Spring Boot只需要很少的配置就可以运行。可以使用Spring Boot快速创建可以通过Java -jar启动的Java应用程序。 Spring Boot的主要目标: 为所有的Spring开发者提...

李思净的博客 3984

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6954

rk3568 rockit编译测试

编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。此处跳过系统,单领出来编译。rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。

zfenggo的博客 4198

Spring Boot中Tomcat配置

在某些情况下,我们可能需要自定义Tomcat的连接器,以满足特定的安全需求或性能优化需求。这时,我们可以通过编写配置类来实现。@Bean// 可以添加其他自定义配置在这个配置类中,我们创建了一个自定义的Tomcat连接器,并将其添加到TomcatServletWebServerFactory中。通过这种方式,我们可以更灵活地控制Tomcat的行为。Tomcat连接器配置详解在Spring Boot项目中配置Tomcat是一个既简单又复杂的过程。

2509_93957743的博客 545

华为OD机试 - 最快到达医院的方法(Python/JS/C/C++ 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2172

Spring Boot 3.x升级依赖冲突解决方案

在Java企业级开发中,依赖管理是构建稳定系统的关键技术。Maven和Gradle通过依赖传递机制自动解析库版本,但这也可能导致版本冲突问题。Spring Boot 3.x基于Spring Framework 6和Java 17的重大升级,使得依赖兼容性问题尤为突出。通过分析依赖树、合理使用exclusions标签以及统一版本管理,开发者可以有效解决spring-boot-starter-web、MyBatis等组件的版本冲突。特别是在微服务架构中,正确处理Spring Cloud Alibaba、Redi

weixin_30700977的博客 373

基于YOLOv8的人群聚集检测系统:含UI界面设计与数据集应用

人群聚集检测是智慧城市、公共安全和疫情防控等领域的重要任务。本文结合YOLOv8最新目标检测技术,设计并实现了一个高效的人群聚集检测系统,支持可视化UI界面操作,方便用户实时检测和分析视频中的人群密度。本文详细介绍了系统设计思路、使用的数据集、YOLOv8模型训练和推理过程,以及UI界面的开发与整合。最后通过实验验证了该系统的实用性和性能表现。更灵活的模型架构强化的特征融合网络(PAN++)自动混合精度训练支持支持多任务学习(目标检测+分类+分割)预训练模型丰富,适应多种应用场景。

YOLO 434

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot参考指南(Spring Boot Reference Guide) v2.1.5 release

SpringBoot官方文档 v2.1.5 releasePart I. Spring Boot 参考指南1. 关于文档2. 获得帮助3. 第一步4. 使用Spring Boot 进行工作5. 学习Spring Boot的特性6. 移动至生产环境7. 高级内容Part IX. "怎样做"向导 作者: Phillip Webb , Dave Syer , Josh Long , Stéphane N...

weixin_43676119的博客 5802

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Boot 2(一):【重磅】Spring Boot 2.0权威发布

就在今天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误,然后Spring Boot官方又赶紧把 GitHub 上发布的 v2.0.0.RELEASE 版本进行了撤回。到了下午将问题修复后,又重新进行了上传,至此Spring Boot2.0正式推出! 要知...

xiaobolihuan的博客 223

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

0x01 Spring Boot 2.x 之入门学习指南

如果你刚开始学习Spring Boot 或者Spring,那么应该从这篇博文开始阅读。 它会回答你 是什么?怎么做?为什么?这些基础性问题。它包含了Spring Boot的介绍,安装说明,然后会带你开始自己亲手创建一个Spring Boot 应用程序,顺便讲解一些用法规则。

极客星云-优快云博客 989

​Spring Boot 2.0 同步至 Maven 仓库出错,已撤回……

Spring Boot 2.0 目前已在 GitHub 上发布了 v2.0.0.RELEASE 版本(https://github.com/spring-projects/spring-boot/releases/tag/v2.0.0.RELEASE)。不过还没同步至 Maven 中央仓库,请保持关注 https://projects.spring.io/spring-boot/ 。最新消息,由于...

lsxf_xin的专栏 1万+

spring boot系列一 demo测试

1.  参考official  guide http://projects.spring.io/spring-boot/#quick-start 2.  在eclipse  新建  maven工程,具体细节skip,完成后如下所示: 3. POM 文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xml

Just Do It! 8627

Spring Boot 2.0.0 终于正式发布,重大修订版本

北京时间 2018 年 3 月 1 日早上,如约发布的 Spring Boot 2.0 在同步至 Maven 仓库时出现问题,导致在 GitHub 上发布的 v2.0.0.RELEASE 被撤回。目前问题已修复,官方重新发布了 Spring Boot 2.0,并提供了 Maven 中央仓库地址。使用 Spring Boot 2.0.0 GAMaven&lt;parent&gt;     &lt;g...

lsxf_xin的专栏 1万+
上一篇: spring-boot-autoconfigure
下一篇: proxysql的安装和使用(docker)
五克松
博客等级 码龄17年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值