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

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

       我们知道,springboot默认使用的是内嵌的tomcat作为web服务器,我们可以通过配置文件对tomcat的参数进行修改,比如server.port表示监听端口,server.contextPath表示上下文路径,server.tomcat.max-connections表示,完整配置可参考 https://docs.spring.io/spring-boot/docs/1.5.14.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) EnableAutoConfiguration会触发许多自动配置,其中就包括了EmbeddedServletContainerAutoConfiguration(至于EnableAutoConfiguration是怎么触发各个自动配置类的可以参考 spring-boot-autoconfigure)

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(BeanPostProcessorsRegistrar.class)  //引入BeanPostProcessorsRegistrar,见下面的代码
public class EmbeddedServletContainerAutoConfiguration {

	@Configuration
    // 默认情况下,Servlet.class和Tomcat.class都在classpath中,因此这个条件满足
	@ConditionalOnClass({ Servlet.class, Tomcat.class })
    // 若用户没有自定义的EmbeddedServletContainerFactory,则继续往下
	@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
	public static class EmbeddedTomcat {

        // 如上面的@ConditionalOnClass和@ConditionalOnMissingBean,则实例化一个TomcatEmbeddedServletContainerFactory
		@Bean
		public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
			return new TomcatEmbeddedServletContainerFactory();
		}

	}
     
    // ... 省略无关代码 ...

    // 通过上面的@Import会引入这个BeanPostProcessorsRegistrar
	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;
			}
            // 关键是这里,确保EmbeddedServletContainerCustomizerBeanPostProcessor实例存在,若不存在则实例化一个,因此这个类很重要,之后需要关注一下
			registerSyntheticBeanIfMissing(registry,
					"embeddedServletContainerCustomizerBeanPostProcessor",
					EmbeddedServletContainerCustomizerBeanPostProcessor.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);
			}
		}

	}

       (3)现在来看看EmbeddedServletContainerCustomizerBeanPostProcessor做了什么,详见下面的代码注释。

// 实现了两个接口BeanPostProcessor和BeanFactoryAware 
// BeanPostProcessor主要用于bean在初始化前后可以定制
// BeanFactoryAware的setBeanFactory可以用来获取beanFactory
public class EmbeddedServletContainerCustomizerBeanPostProcessor
		implements BeanPostProcessor, BeanFactoryAware {

	private ListableBeanFactory beanFactory;

	private List<EmbeddedServletContainerCustomizer> customizers;

	@Override
	public void setBeanFactory(BeanFactory beanFactory) {
		Assert.isInstanceOf(ListableBeanFactory.class, beanFactory,
				"EmbeddedServletContainerCustomizerBeanPostProcessor can only be used "
						+ "with a ListableBeanFactory");
		this.beanFactory = (ListableBeanFactory) beanFactory;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
        // 如果bean是ConfigurableEmbeddedServletContainer则执行,巧的很,我们上一步在 
       // EmbeddedServletContainerAutoConfiguration中实例化的TomcatEmbeddedServletContainerFactory就属于ConfigurableEmbeddedServletContainer,所以postProcessBeforeInitialization方法对TomcatEmbeddedServletContainerFactory起作用
		if (bean instanceof ConfigurableEmbeddedServletContainer) {
			postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer) bean);
		}
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}

	private void postProcessBeforeInitialization(
			ConfigurableEmbeddedServletContainer bean) {
        // 找到所有的EmbeddedServletContainerCustomizer实例,然后分别执行他们的customize方法
		for (EmbeddedServletContainerCustomizer customizer : getCustomizers()) {
			customizer.customize(bean); //这里就引出了一个问题,这些customizer是哪里来的
		}
	}

	private Collection<EmbeddedServletContainerCustomizer> getCustomizers() {
		if (this.customizers == null) {
            // 找到所有的EmbeddedServletContainerCustomizer实例
			// Look up does not include the parent context
			this.customizers = new ArrayList<EmbeddedServletContainerCustomizer>(
					this.beanFactory
							.getBeansOfType(EmbeddedServletContainerCustomizer.class,
									false, false)
							.values());
            //对customizers下的实例就行排序,排序的规则主要是依据实例是否有@Order注解或实现的Order接口,根据order值进行排序
			Collections.sort(this.customizers, AnnotationAwareOrderComparator.INSTANCE);
			this.customizers = Collections.unmodifiableList(this.customizers);
		}
		return this.customizers;
	}

}

     (4) 根据上面的代码分析,我们发现它用到了多个EmbeddedServletContainerCustomizer实例,那么这些实例是哪里来的呢?从类名的语义来看好像是用来自定义EmbeddedServletContainer的,先看一下它的接口代码,它只有一个customize方法,而入参是ConfigurableEmbeddedServletContainer,而我们之前在步骤(2)中实例化的TomcatEmbeddedServletContainerFactory也是他的一个实现类。

public interface EmbeddedServletContainerCustomizer {

	/**
	 * Customize the specified {@link ConfigurableEmbeddedServletContainer}.
	 * @param container the container to customize
	 */
	void customize(ConfigurableEmbeddedServletContainer container);

}

          既然它是个可自定义实现的接口,那就说明我们可以根据实现EmbeddedServletContainerCustomizer接口来对TomcatEmbeddedServletContainerFactory进行定制化配置。比如我们需要在tomcat中添加一个自定义的valve,显然通过修改properties是没办法直接实现的,因此需要我们通过代码的方式来解决这个问题。

  @Bean
  public EmbeddedServletContainerCustomizer createEmbeddedServletContainerFactory() {
    return container -> {
      TomcatEmbeddedServletContainerFactory factory =   (TomcatEmbeddedServletContainerFactory) container;
      factory.addContextValves(valve);
    };
  }

      刚才我们也说到,EmbeddedServletContainerCustomizerBeanPostProcessor有多个customizer,那还有哪些呢?以下是启动spring-boot时的断点,可以发现有5个customizer,其中最后一个是我自定义的,其他都是spring-boot默认实现的,大家有没有注意到其中有个ServerProperties,熟悉spring-boot配置的对这个类应该不陌生,里面对应的是application.yml中的server.port 、server.address、server.contextPath等配置,所以这也解释了为什么我们可以在applicaiton.yml对内嵌的tomcat进行配置了。

     

        一般情况下,我们看到ServerProperties的名字首先想到的它就是一个配置类,然而看一下它的结构,他却实现了很多接口,比如我们上面提到的EmbeddedServletContainerCustomizer,还有Orderd接口,所以他在上面排序其实是跟他实现的Orderd有关的(这其实是一种很奇怪的实现,所以在2.0版本以后做了改变)

      (5) 上面的过程其实很简单,就是实例化一个TomcatEmbeddedServletContainerFactory实例,然后在EmbeddedServletContainerCustomizerBeanPostProcessor中使用多个EmbeddedServletContainerCustomizer对TomcatEmbeddedServletContainerFactory进行修改,最终得到一个可用的TomcatEmbeddedServletContainerFactory,而通过这个factory的getEmbeddedServletContainer方法可以获得一个TomcatEmbeddedServletContainer,至此tomcat的实例化讲解完毕。

	@Override
	public EmbeddedServletContainer getEmbeddedServletContainer(
			ServletContextInitializer... initializers) {
		Tomcat tomcat = new Tomcat();
		File baseDir = (this.baseDirectory != null ? this.baseDirectory
				: createTempDir("tomcat"));
		tomcat.setBaseDir(baseDir.getAbsolutePath());
		Connector connector = new Connector(this.protocol);
		tomcat.getService().addConnector(connector);
		customizeConnector(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);
	}

	protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
			Tomcat tomcat) {
		return new TomcatEmbeddedServletContainer(tomcat, getPort() >= 0);
	}

          最后再补充一点儿,我们知道spring-boot默认支持三种web服务:tomcat、jetty、undertow ,为什么默认是tomcat,怎样可以使用其他两种,我们先回答第一个问题,在之前的EmbeddedServletContainerAutoConfiguration中有这样一段代码,由于jetty和undertow依赖的java类不在classpath中,所以不会实例化对应的factory,另外还有个@ConditionalOnMissingBean限制条件,只有EmbeddedServletContainerFactory实例不存在时才会加载jetty或undertow,这其实也引出了第二个问题的答案...

      以jetty为例,我们怎样才能让spring-boot使用jetty作为默认的web容器呢?只需要做两件事:加入jetty的相关依赖包,剔除tomcat的相关依赖包,在maven中我们可以这样做

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
       </dependency>

有兴趣的同学还可以参考另一篇博文 spring-boot如何得到一个tomcat实例(基于spring-boot_v2.0.6.RELEASE)

Ubuntu 14.04下Tomcat 7安装与稳定运行实战指南 Tomcat 是 Java Web 应用最经典的轻量级 Servlet 容器,其部署原理涉及包管理、依赖解析、进程服务化与 JVM 运行时配置等基础技术栈。在老旧但仍在政企内网服役的 Ubuntu 14.04 系统中,因官方源归档导致 apt-get update 失败、libc6 版本锁死、upstart/systemd 初始化冲突等典型问题频发,凸显出系统兼容性与长期支持(LTS)环境下的运维复杂性。本文聚焦于 Tomcat 7 在废弃源环境下的可复现安装、服务启动排障及最小化加固,覆盖 apt 源迁移 阅读详情

相关推荐

Java+Vue+Spring Boot+MySQL电影评论网站毕业设计全栈开发指南

在Web应用开发领域,前后端分离架构已成为主流范式,其核心原理是将用户界面与业务逻辑解耦,通过RESTful API进行数据交互。这种模式提升了开发效率与系统可维护性,其技术价值在于支持团队并行开发和独立部署。典型的应用场景包括内容管理系统、社交平台和电商网站。本文聚焦于一个结合了Java、Spring Boot、Vue和MySQL四大主流技术的电影评论网站项目,它完整覆盖了用户认证、内容管理、数据交互等核心模块,是实践全栈开发的理想案例。通过剖析该项目的架构设计与实现细节,读者可以深入理解如何将Sprin

weixin_33801856的博客 365

配置嵌入式servlet容器

springboot默认是用的Tomcat作为嵌入式的servlet容器; 问题? 之前: 外置的Tomcat需要在外面Tomcat的conf的server.xml,webxml..配置文件进行修改 现在如何修改? 在配置文件.properties或者.yml 修改和server有关的配置, server.xx 能否支持其他的, 编写一个EmbeddedServletContainerCustomizer:嵌入式servlet容器的定制器;来修改servlet容器的配置 发现在Spring Bo

qq_42058441的博客 973

SpringBoot调用流程源码(十六)tomcat的启动(六)Connector的initInternal方法

在上篇文章中说到,StandardServcie的initInternal()方法,进入了Connector的initInternal方法,其方法如下: 一、StandardService.initInternal @Override protected void initInternal() throws LifecycleException { supe...

lz710117239的博客 1816

SpringBoot系列十四:嵌入式Servlet容器

一、配置嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器; 1、定制和修改Servlet容器的相关配置 (1)、修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】)。 server.port=8081 server.context-path=/crud ser...

苍穹尘的博客 943

【SpringBoot 4.x 第1节】夯爆了,为什么现在要学 Spring Boot 4.x?从零开始理解版本体系、核心变化与真实项目开发路线(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 1万+

【JESD79-5之】11 IDD, IDDQ, IPP规格参数和测试条件(IDD, IDDQ, IPP Specification Parameters and Test conditions)

【代码】【JESD79-5之】11 IDD, IDDQ, IPP规格参数和测试条件(IDD, IDDQ, IPP Specification Parameters and Test conditions)

m0_61126667的博客 4863

3.3通过EmbeddedServletContainerCustomizer调用Tomcat

Spring Boot暴露了许多服务属性,这个属性可以用于配置一些事情,如PORT,SSL,其它的可以简单地配置在application.properties文件中。然而,如果我们想要做更加复杂的调用,Spring Boot提供给我们EmbeddedServletContainerCustomizer接口去声明我们的配置。 通过使用server.sessiontimout设置超时时间,我们将使用EmbeddedServletContainerCustomizer去控制我们的应用。 3.3.1代码实...

owen_william的博客 6026

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月10日

前文:SABRE 3D系列机台简介本章节详细阐述了在维护期间锁定电气、机械、热力学及重力组件以及化学管线输入的锁定操作流程,旨在降低人员受伤风险。p42~p55。

weixin_46735260的博客 1617

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

在上一篇博文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-b...

小木公会 1349

电工识图入门:从电气符号到控制逻辑的完整指南

电工图纸是电气工程领域的通用语言,无论是设备安装、线路检修还是系统设计,看不懂图纸就像航海没有海图。很多初学者面对复杂的电气符号和线路走向感到无从下手,实际上只要掌握正确的识图方法,就能从简单的照明电路逐步过渡到复杂的自动化控制系统。 本文将从最基础的电气符号和图纸类型讲起,通过实际图纸案例解析,带你建立完整的识图逻辑。你将学会如何区分主回路和控制回路,如何追踪电流路径,以及如何结合图纸进行故障排查。无论你是电工新手、设备维护人员还是相关专业学生,这套方法都能帮你快速提升图纸理解能力。 1. 电气图纸基础:

chengyixian7877的博客 338

vue3的面试题

vue3的面试题

jiang7701037的博客 6271

jetty 无法编译java_spring boot使用jetty无法启动

1.maven项目下多个module,parent的pom中引入了spring-boot1.5.8RELEASE版本。多个module中的只有一个用到spring-boot,而且不用内置的tomcat,而是要替换成jetty。2.parent的pom内容如下:1.5.8.RELEASEorg.springframework.bootspring-boot-dependenciespomimport...

weixin_36418590的博客 485

同花顺【红绿趋势】幅图指标 源码分析

a10:IF(差值<=0 ,0 ,差值*0.2 ,4 ,0),STICK,linethick5,colorred;a7:IF(差值<=0 ,0 ,差值*0.8 ,4 ,0),STICK,linethick5,colorred;a8:IF(差值<=0 ,0 ,差值*0.6 ,4 ,0),STICK,linethick5,colorred;a6:IF(差值<=0 ,0 ,差值*1 ,4 , 0),STICK,linethick5,colorred;DRAWICON(先锋<0,-25,1);

zhibiaogong的博客 4071

用spring boot 来创建第一个application

用spring boot 来创建一个简单的“Hello World!”Web应用程序,该应用程序突出了Spring Boot的一些主要功能。我们使用Maven来构建这个项目,因为大多数IDE都支持它。 在开始之前,打开终端并运行以下命令以确保安装了有效的Java和Maven版本: 1 $ java -version 2 java版“1.8.0_102” 3 Java...

weixin_30827565的博客 171

金融科技风险管理实践之监管评级全解

内部审计是公司治理的四大基石之一。因此,建议银行以问题与结果为导向,推动科技风险分级分类管理,重点防范重大中断、重大事件,并进一步加强科技风险评估与监测,加强对重要管理流程、重要系统、网络等重点管控环节的评估监测,对于评估发现的问题,及时完善管理手段,举一反三解决问题,提高风险管理的有效性。投入更多审计资源,加大对重点机构、薄弱环节、重要领域的审计力度,如:加强对境外机构的审计,加强网络安全、数据安全、业务连续性等高风险领域审计,加强数字化转型过程中的风险审计,以高水平安全,为数字金融高质量发展保驾护航。

银行信息系统应用架构详解 457

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1474

spring boot 的web项目

spring boot web修改完类或者配置之后,通常需要重新部署之后才能生效,如果每次都手动运行非常不方便,,幸好spring boot提供了spring-boot-devtools,它能在修改类或者配置文件的时候自动重新加载spring boot应用,当然首先要在pom文件的 dependencies标签里 中添加如下依赖 <dependency> <groupId>org.springframework.boot</groupId>

爱的叹息的专栏 698

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 1 2

本关任务:从文件user.txt中读取用户信息,包括账号、密码、联系方式等,创建一个用户信息的顺序表,根据账号判断顺序表中是否存在当前用户。如果存在,则添加失败。否则,判断输入的用户信息中是否有非法输入,若有则添加失败,否则将该用户作为新结点,按顺序插入到顺序表的相应位置,并将用户顺序表写入user.txt中。本关任务:从文件user.txt中读取用户信息,存入顺序表中。输入待查找的用户账号,调用折半查找算法判断用户顺序表中是否存在该用户的账号信息。如果存在,则返回其在顺序表中的位置,说明查找成功;

m0_62222486的博客 4960

Vue+Spring Boot全栈权限管理系统设计与实战

权限管理是现代企业级应用的核心模块,基于RBAC模型的访问控制技术通过角色映射实现用户权限分配,能有效解决功能权限与数据权限的管控问题。在技术实现上,前后端分离架构结合JWT认证已成为行业主流方案,其中Vue+Element UI提供动态路由和组件级权限控制能力,Spring Security则负责后端的认证授权与安全防护。这类系统在金融、政务等需要多终端适配和高安全要求的场景中尤为重要,通过引入代码生成器可显著提升CRUD开发效率。本文详解的权限管理引擎支持四维控制体系(功能/数据/字段/时间权限),并采

weixin_33850015的博客 431

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

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

Spring Boot (1) Hello World

Begin at Hello WorldThis section describes how to develop a simple “Hello World!” web application that highlights some of Spring Boot’s key features. We use Maven to build this project, since most IDE...

尘世中迷途小码农的专栏 239

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

html5 java spring tomcat_SpringBoot源码篇:Spring5内置tomcat实现code-based的web.xml实现

一、简介上篇文章讲了SpingBoot诞生的历史背景和技术演进背景,并通过源码说明了SpringBoot是如何实现零配置的包括如何省去web.xml配置的原理。本文接上一篇文章,通过demo演示SpringBoot是如何内置tomcat并实现基于java配置的Servlet初始化和SpringBoot的启动流程。二、基于java配置的web.xml实现传统SpringMVC框架web.xml的配置...

weixin_36240211的博客 204

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

端口占用问题:The Tomcat connector configured to listen on port 80 failed to start. The port may already be

The Tomcat connector configured to listen on port 80 failed to start. The port may already be in use or the connector may be misconfigured. 最近做一个综合项目 遇到的一个小问题 错误提示如下: 给了以下几个建议 . ____ _ ...

qq_42909663的博客 2656

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

版权声明:本文为博主原创文章,未经博主允许不得转载。   目录(?)[+]   spring boot实战(第一篇)第一个案例 前言 写在前面的话 一直想将spring boot相关内容写成一个系列的博客,今天终于有时间开始了第一篇文章 以后有时间就会继续写下去。 spring boot 博客内容规划 spring boot 基本用法 自动配置 技术集成 性能监控 源码解析 sp...

weixin_34206899的博客 106

An incompatible version [1.1.24] of the APR based Apache Tomcat Native library is installed

问题: :: Spring Boot ::        (v2.0.0.RELEASE)2018-03-16 23:19:34.815  INFO 6564 --- [           main] com.imooc.GirlApplication                : Starting GirlApplication on Lucky with PID 6564 (E:\dre...

掘金者说 1万+

Spring Boot 入门

新手入门 如果您刚开始使用Spring Boot或者只是普通的“Spring” , 请先阅读这个章节. 因为这部分内容可以回答以下几个问题: “what?”, “how?” and “why?” . 包括Spring Boot的相关介绍以及安装说明. 然后,我们将引导您构建您的第一个Spring Boot应用程序,并在此过程中讨论一些核心原则。 1. Spring Boot简介 Spring Boot 使创建可以运行的、独立的、生产级的基于spring的应用程序变得简单. 我们集成了Spring平台和

ly1944cool的博客 683

spring boot微服务改造冲突

1.报错: 13:57:49.959 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed java.lang.IllegalAccessError: tried to access method org.springframework.core.convert.support.D...

weixin_33856370的博客 451
上一篇: mosquitto的鉴权配置
下一篇: Dbunit的使用---dataset
五克松
博客等级 码龄17年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值