27.1.从零开始学springboot-运行原理

springboot当中的27个核心maven依赖 springboot当中的27个核心maven依赖(可一键复制导入) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath /> <!-- 阅读详情

前言

SpringBoot作为目前最流行的 Java 开发框架,秉承“约定优于配置”原则,大大简化了 Spring MVC 繁琐的 XML 文件配置,基本实现零配置启动项目。
本文基于SpringBoot 2.1.4.RELEASE 版本,通过一步步追踪代码,详细探求 SpringBoot的运行原理。

图解

整个springboot运行流程可以由如下图表示(图来自互联网,版权归原作者所有)
1.png

入口类

首先让我们看一下最简单的 SpringBoot入口类

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解 @SpringBootApplication 来启用SpringBoot特性,使用 SpringApplication.run 方法来启动 Spring Boot 项目。

首先我们来看下@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 {
        //....省略
}

由上可以看出@SpringBootApplication注解实际上是SpringBoot提供的一个复合注解,其中最重要的三个注解分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

事实上,我们可以把入口类上的@SpringBootApplication这个注解替换为以上三个注解,效果是一样的。同学们可以自己试试。

下面我们分别阐述这三个注解都是干什么的。

@SpringBootConfiguration

@SpringBootConfiguration
追踪其实现代码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

终于看到熟悉的@Configuration注解了,在Spring中,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置类所使用。
这说明 @SpringBootConfiguration 也是来源于 @Configuration,二者功能都是将当前类标注为配置类,并将当前类里以 @Bean 注解标记的方法的实例注入到srping容器中,实例名即为方法名。

@EnableAutoConfiguration

@EnableAutoConfiguration
实现代码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
        //....省略
}

@EnableAutoConfiguration注解作用是启用自动配置,可以帮助 SpringBoot 应用,将所有符合条件的 @Configuration 配置都加载到当前 IoC 容器之中

@AutoConfigurationPackage自动配置包,将SpringBootApplication主配置类所在包以及子包的所有子类扫描到spring容器

@Import(AutoConfigurationImportSelector.class)导入组件开启自动配置类导包的选择器。
我们可以追踪AutoConfigurationImportSelector这个类看看其实现

	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
				autoConfigurationMetadata, annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

对应的getAutoConfigurationEntry()实现

protected AutoConfigurationEntry getAutoConfigurationEntry(
			AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}

getCandidateConfigurations()的实现

	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
			AnnotationAttributes attributes) {
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
				getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
		Assert.notEmpty(configurations,
				"No auto configuration classes found in META-INF/spring.factories. If you "
						+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

可以看出selectImports() 方法最终是通过调用SpringCore 包里 SpringFactoriesLoader 类的 loadFactoryNames()方法,读取了 ClassPath 下面的 META-INF/spring.factories 文件来获取所有导出类。而spring.factories 文件里关于 EnableAutoConfiguration 的配置其实就是一个键值对结构,我们看下对应的spring.factories文件内容

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
//.......省略

最后,我们概括下,@EnableAutoConfiguration注解实现了从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。

@ComponentScan

最后我们看下@ComponentScan注解
@ComponentScan 对应于XML配置形式中的 context:component-scan,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:
@Controller
@Entity
@Component
@Service
@Repository
等等

对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:

@ComponentScan(basePackages = {"com.mrcoder.controller","com.mrcoder.entity"})

SpringApplication实例初始化过程分析

追踪入口类中的run方法

public static ConfigurableApplicationContext run(Class<?> primarySource,
        String... args) {
    return run(new Class<?>[] { primarySource }, args);
}

/**
  * 第一个参数 primarySource:加载的主要资源类
  * 第二个参数 args:传递给应用的应用参数
  */
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
        String[] args) {
    return new SpringApplication(primarySources).run(args);
}

可以看出,run方法先用主要资源类primarySources 来实例化一个 SpringApplication 对象,再调用这个SpringApplication对象的 run 方法。
进入SpringApplication()构造方法

public SpringApplication(Class<?>... primarySources) {
    this(null, primarySources);
}

然后进入SpringApplication构造函数

@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    //1.资源初始化资源加载器为 null
    this.resourceLoader = resourceLoader;
    //2.断言主要加载资源类不能为 null,否则报错
    Assert.notNull(primarySources, "PrimarySources must not be null");
    //3.初始化主要加载资源类集合并去重
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    //4.推断当前 WEB 应用类型
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    //5.设置应用上线文初始化器
    setInitializers((Collection) getSpringFactoriesInstances(
            ApplicationContextInitializer.class));
    //6.设置监听器            
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    //7.推断主入口应用类
    this.mainApplicationClass = deduceMainApplicationClass();
}

对于1-3没有什么好讲的,大家都能看懂,
我们看看后几步。
第4步
这个就是根据类路径下是否有对应项目类型的类推断出不同的应用类型,进入该类可以看到

package org.springframework.boot;
import org.springframework.util.ClassUtils;
public enum WebApplicationType {
    //非 WEB 项目
	NONE,
	//SERVLET WEB 项目
	SERVLET,
	//响应式 WEB 项目
	REACTIVE;
	
    //省略......

第5步

setInitializers((Collection) getSpringFactoriesInstances(
        ApplicationContextInitializer.class));

ApplicationContextInitializer该类是干啥的呢?进入该类可以看到如下定义

package org.springframework.context;
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
	void initialize(C applicationContext);
}

用来初始化指定的 Spring 应用上下文,如注册属性资源、激活 Profiles 等。
接下来我们来分析下第5步使用的setInitializers()方法

public void setInitializers(
        Collection<? extends ApplicationContextInitializer<?>> initializers) {
    this.initializers = new ArrayList<>();
    this.initializers.addAll(initializers);
}

分析实现源码,可以看出,其实就是初始化一个 ApplicationContextInitializer 应用上下文初始化器实例的集合。

接下来看下getSpringFactoriesInstances()的方法实现

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type) {
    return getSpringFactoriesInstances(type, new Class<?>[] {});
}

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
        Class<?>[] parameterTypes, Object... args) {
    //1.获取当前线程上下文类加载器
    ClassLoader classLoader = getClassLoader();
    //2.获取 ApplicationContextInitializer 的实例名称集合并去重
    Set<String> names = new LinkedHashSet<>(
            //3.loadFactoryNames根据类路径下的 META-INF/spring.factories 文件解析并获取 ApplicationContextInitializer 接口的所有配置的类路径名称。
            SpringFactoriesLoader.loadFactoryNames(type, classLoader));
            //4.根据以上类路径创建初始化器实例列表
    List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
            classLoader, args, names);
    //5.初始化器实例列表排序
    AnnotationAwareOrderComparator.sort(instances);
    //6.返回初始化器实例列表
    return instances;
}

在看第6步,设置监听器,可以看到使用了ApplicationListener这个类,

package org.springframework.context;
import java.util.EventListener;
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
	void onApplicationEvent(E event);
}

以上代码可知,这个接口继承了 JDK 的 java.util.EventListener 接口,实现了观察者模式,它一般用来定义感兴趣的事件类型,事件类型限定于 ApplicationEvent 的子类,这同样继承了 JDK 的 java.util.EventObject 接口。

设置监听器和设置初始化器调用的方法是一样的,只是传入的类型不一样,设置监听器的接口类型为getSpringFactoriesInstances,对应的spring-boot-autoconfigure-2.1.4.RELEASE.jar!/META-INF/spring.factories 文件配置内容请见下方

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

可以看出目前只有一个 BackgroundPreinitializer 监听器。

第7步推断主入口应用类

private Class<?> deduceMainApplicationClass() {
    try {
        StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            if ("main".equals(stackTraceElement.getMethodName())) {
                return Class.forName(stackTraceElement.getClassName());
            }
        }
    }
    catch (ClassNotFoundException ex) {
        // Swallow and continue
    }
    return null;
}

这个推断入口应用类的方式有点特别,通过构造一个运行时异常,再遍历异常栈中的方法名,获取方法名为 main 的栈帧,从来得到入口类的名字再返回该类。

请关注我的订阅号

订阅号.png

【Springboot】笔记1 01、基础入门-SpringBoot2课程介绍 在B站边看视频边补充笔记,是在b站那里获取的文档和资料,自己进行笔记的修修改改,仅供参考,方便个人使用的,在源码分析部分,我感觉我看的不是很懂,有没有大佬分享一下源码分析的方法或者技巧,我一看源码就犯困!!! Spring Boot 2核心技术 Spring Boot 2响应式编程 学习要求 -熟悉Spring基础 -熟悉Maven使用 环境要求 Java8及以上 Maven 3.3及以上 学习资料 Spring Boot官网 Sprin 阅读详情

相关推荐

基于SpringBoot的乡村研学旅行平台

基于SpringBoot的乡村研学旅行平台,java项目。eclipse和idea都能打开运行。推荐环境配置:eclipse/idea jdk1.8 maven mysql前端技术:微信小程序,vue,Ajax,Json后端技术:SpringBoot,MyBatis本系统共分为两个角色:管理员和用户。主要功能有:后台:登录、个人中心、管理员管理、客服聊天管理、基础数据管理、论坛管理、景点管理、商品管理、研学管理、用户管理等。

qq_45800365的博客 1036

27.2.从零开始学springboot-运行原理

前言 上章介绍了springboot入口类SpringApplication类的初始化流程,本章,我们分析介绍SpringApplication.run()方法的运行流程及原理。 SpringApplication实例run方法运行原理分析 public ConfigurableApplicationContext run(String... args) { //1.创建并启动计时监控类 ...

CTO技术的博客 210

无需Root!用VirtualXposed+JustTrustMe在安卓高版本上抓包拼多多API数据

本文详细介绍了在安卓高版本设备上无需Root权限即可抓取拼多多API数据的完整方案,通过VirtualXposed与JustTrustMe组合技术,有效绕过SSL Pinning限制。文章涵盖工具准备、环境配置、应用处理及实战分析,特别针对PDD应用的混合通信策略提供了专业解决方案,适合开发者进行竞品分析和数据采集。

weixin_28678151的博客 453

springboot的最核心的27个注解详解

SpringBoot是一个框架,一种全新的编程规范,它的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置,所以SpringBoot是一个服务于框架的框架,服务范围是简化配置文件以及简化我们编写代码的难度, 其中注解起到了非常关键的作用, 能够极地降低我们的代码量, 今天我们就来介绍一下Springboot的最核心的27的注解. 1.@SpringBootApplication Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个

梧桐树的博客 1万+

联想Win10改Win7设置BIOS指南

通过本文的指南,你应该能够成功地在联想Win10电脑上设置BIOS以支持Windows 7的安装和运行。尽管Windows 10提供了许多现代化的功能和改进,但如果你因特定需求而更倾向于使用Windows 7,那么本文提供的步骤将帮助你顺利实现这一转换。请记住,在更改操作系统前务必做好充分的准备工作,并在安装过程中保持耐心和细心。祝你安装顺利!

mmoo_python的博客 2035

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

jsp产学合作项目管理系统1s27p

系统设计将遵循MVC架构模式,注重用户体验和界面友好性,同时加强系统的安全性和稳定性,确保数据的完整性和隐私保护。因此,开发一套基于JSP的产学合作项目管理系统,旨在通过信息化手段优化管理流程,提升合作效率,促进企业与高校之间的深度合作,具有重要意义。该系统将有效改善传统管理方式的不足,提升产学合作项目的管理效率和合作质量,促进企业与高校之间的深度交流和合作。:系统需设立企业与高校之间的双向投诉与建议功能,允许双方就合作过程中出现的问题进行反馈,促进问题的及时解决和合作关系的持续改进。

CK3028的博客 1107

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3861

最新MySql8.27主从复制以及SpringBoot项目中的读写分离实战

Sharding-JDBC定位为轻量级Java框架,在Java的DBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的DBC驱动,完全兼容JDBC和各种ORM框架。使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,.Mybatis,Spring JDBC Template或直接使用DBC。...

我要记录学习博客 1212

开发具有情感分析能力的AI Agent

本文将深入探讨开发具有情感分析能力的AI Agent的各个方面。我们将首先介绍情感分析的基础知识,包括定义、背景和应用领域。接着,我们将详细讲解情感分析的核心概念、数据处理方法和算法原理。随后,文章将展示如何设计情感分析系统架构,并进行项目实战,包括环境安装、源代码实现和案例分析。最后,我们将总结最佳实践和注意事项,为读者提供进一步学习的资源。情感分析(Sentiment Analysis),也称为意见挖掘,是自然语言处理(NLP)的一个分支。

SuperAGI2025 1146

【软考高项】【计算专题】- 3 - 进度类 - 双代号网络图

共需压缩 20 天。在双代号网络图中,工作一般使用箭线表示,任意一条箭线都需要占用时间、消耗资源,工作名称写在箭线的上方,而消耗的时间则写在箭线的下方或者工作后面。反映的是前后工作的交接点,节点中的编号可以任意编写,但应保证后续工作的节点比前面节点的编号大,即上图图中的1⃣️4⃣️ 即表示 B 活动和 D 活动间有依赖关系,D 活动的开始,依赖 B 活动的结束。B活动完成了一半, 各计划的实际支出为A活动6500元, B活动1000元, C活动280元, D。

欢迎来到我的博客,一起探索代码里的世界! 4559

27.SpringBoot和SpringMVC的区别

spring boot与spring mvc的区别是什么? spring boot只是一个配置工具,整合工具,辅助工具.springmvc是框架,项目中实际运行的代码Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop. ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其...

郑学炜的技术博客 4万+

OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备

OmniParser V2 和 OmniTool 是由微软开发的一套工具,通过屏幕解析技术让 AI 能够理解和控制 Windows 设备。OmniParser V2 是一款数据解析工具,可以解读屏幕内容,并将内容传递给大模型OmniTool 则是一个运行 Windows Agent 的工具,提供 Windows 界面给 AI 操作。

简简单单Onlinezuozuo 2728

第一节:创建SpringBoot项目并运行HelloWorld

SpingBoot 365计划开始更新了,计划手敲365个SpringBoot案例回顾总结形成知识体系。目前已经输出了32节的内容。所有源码托管在GitHub和Gitee上。 1.第一节:创建SpringBoot项目并运行HelloWorld.md 2.第二节:SpingBoot单元测试.md 3.第三节:SpringBoot中web项目推荐目录结构.md 4.第四节:SpringBoot中web模版数据渲染展示.md 5.第五节:SpringBoot常用注解介绍.md 6.第六节:SpingBoot.

Linux,Java,SpringBoot,Python,Lua略知一点 1083

29、5G PUCCH格式及资源配置详解

本文详细解析了5G通信系统中的物理上行控制信道(PUCCH)的不同格式及其资源配置方案。PUCCH负责传输上行控制信息(UCI),包括混合自动重传请求(HARQ)确认信息、调度请求(SR)和信道状态信息(CSI)等。文章从PUCCH的基本概念出发,深入分析了格式0到格式4的特点、编码调制方式、干扰随机化机制以及适用场景,并探讨了PUCCH资源集的配置方法和上行控制信令在PUSCH上的传输机制。通过对比不同格式的传输能力、干扰随机化方式和频率跳变能力,为读者提供了选择合适PUCCH格式的决策依据。最后,文章总

oil88的博客 248

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从零开始 Spring Boot 27:IoC

自从开始学习和从事Spring Boot开发以来,一个一直让我很迷惑的问题是IoC和Bean到底是什么东西。这个问题一直到我翻阅完Spring开发文档后才真正得到解惑。虽然中文互联网上关于IoC的文章很多,但很少有和官方文档那样从零开始讲解并且非常全面的文章。所以学习Spring及相关技术的最好途径依然是官方文档。缺陷是篇幅很长…

梦幻天空 824

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

从零开始学springboot笔记(一)-Spring boot之Hello Word

工具:Eclipse、jdk1.8、maven; 一:先建一个maven的项目 然后再pom文件中添加相关依赖和配置,具体如下: <!-- spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。 --> <parent&gt...

bangheng4869的博客 160

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【我的新书】一步一步学SpringBoot 2:微服务项目实战

开心一笑 【声音有磁性的人适合做直播,可以吸引到很多老铁】 提出问题 我的新书具体内容??? 购买地址 淘宝地址1: https://detail.tmall.com/item.htm?spm=a230r.1.14.4.288c2acbVNjuUw&amp;amp;amp;id=571212826401&amp;amp;amp;cm_id=140105335569ed55e27b&amp;amp;amp;abbuck

IT技术分享 1万+

【MySQL系列3】MySQL执行计划EXPLAIN详细说明和举例,springboot项目运行原理

insert into test (id, name, company, age, create_time) values(‘13’,‘张三丰’,‘jd’,‘108’,‘2020-05-29 12:36:31’); insert into test (id, name, company, age, create_time) values(‘14’,‘张一1’,‘huawei’,‘18’,‘2020-05-29 12:36:11’); insert into test (id, name, company,

m0_65322636的博客 1022

从零开始学Docker(二)

Dockerfile的创建和项目中的应用

qq_36115196的博客 1054

SpringBoot启动原理

背景 1> 大家都知道SpringBoot是通过main函数启动的,这里面跟踪代码到处都没有找到while(true),为什么启动后可以一直跑? 2> SpringBoot默认使用tomcat作为web容器。大家也可以通过在pom文件中exclusion掉tomcat,denpendency jetty 的方法来使用jetty。那SpringBoot是怎么做到在不同web容器之间切换的呢? 3> 传统的web容器比如jetty本质上是直接通过java start.jar 来启动,之后

m0_50180963的博客 241

springboot核心原理

1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行。 2.约定优于配置指的是什么? maven 的目录结构 a) 默认有 resources 文件夹存放配置文件 b) 默认打包方式为 jar spring-boot-starter-web 中默认包含 spring mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web 应用更加简单 默认提供 ap

u013262689的专栏 176

Springboot基于springboot的社区问答网站与设计yhg27

Springboot基于springboot的社区问答网站与设计yhg27本系统(程序源码数据库调试部署开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容。

ck3022的博客 1261

Kubernetes1.27.6服务器集群部署-2023

Kubernetes1.27.6服务器集群部署-2023 1.节点配置 2.环境配置 3.安装容器进行时 4.安装kubeadm kubelet kubectl 5.NFS资源服务部署 6.kubectl常用命令 7.服务部署 mysql consul rocketmq 8.部署springboot应用 9.部署web应用

chinaxsw的博客 519

docker+win10 运行springboot生成的jar文件 2020-09-27

前提已在当前系统上安装docker,并且docker中已存在jdk镜像。 1、为了方便操作,将springboot生成的jar文件放到一个独立的文件夹 2、在该文件夹下面编写Dockerfile文件,内容如下 #用from指定基础镜像(上面提到已安装的jdk8镜像) FROM openjdk:8-jdk-alpine #维护者信息 MAINTAINER xkw #用VOLUME指定持久化目录 VOLUME /tmp #将本地文件添加到容器中 ADD example.jar example.j

w552496722的博客 280

6.从零开始学springboot-连接数据库的几种方式-JDBC

前言 上一节实现了JPA操作mysql,这一节我们实现jdbc也就是jdbcTemplate操作mysql。 创建空项目 首先我们使用IDEA创建一个基础的springboot2.0的项目(创建的过程略,可以参考前几章),无需加载任何依赖(依赖还是手动加载感悟更深)。 添加依赖 pom.xml: &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.s...

CTO技术的博客 9860
上一篇: 24.从零开始学springboot-swagger2文档自动生成
下一篇: 27.2.从零开始学springboot-运行原理
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值