27.2.从零开始学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入口类SpringApplication类的初始化流程,本章,我们分析介绍SpringApplication.run()方法的运行流程及原理。

SpringApplication实例run方法运行原理分析

public ConfigurableApplicationContext run(String... args) {
    //1.创建并启动计时监控类
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    //2.初始化应用上下文和异常报告集合
    ConfigurableApplicationContext context = null;
    //异常通知者列表
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
    //3.设置系统配置java.awt.headless
    configureHeadlessProperty();
    //4.创建所有 Spring 运行监听器并发布应用启动事件
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting();
    try {
        //5.初始化应用启动参数
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                args);
        //6.根据运行监听器和应用参数来准备Spring环境变量
        ConfigurableEnvironment environment = prepareEnvironment(listeners,
                applicationArguments);
        configureIgnoreBeanInfo(environment);
        //7.创建 Banner 打印类
        Banner printedBanner = printBanner(environment);
        //8.创建应用上下文
        context = createApplicationContext();
        //9.获取Spring异常报告者Bean列表
        exceptionReporters = getSpringFactoriesInstances(
                SpringBootExceptionReporter.class,
                new Class[] { ConfigurableApplicationContext.class }, context);
        //10.准备应用上下文
        prepareContext(context, environment, listeners, applicationArguments,
                printedBanner);
        //11.刷新应用上下文
        refreshContext(context);
        //12.应用上下文刷新后置处理
        afterRefresh(context, applicationArguments);
        //13.停止计时监控类
        stopWatch.stop();
        //14.输出日志记录执行主类名、时间信息
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass)
                    .logStarted(getApplicationLog(), stopWatch);
        }
        //15.发布应用上下文启动完成事件
        listeners.started(context);
        //16.执行所有 Runner 运行器
        callRunners(context, applicationArguments);
    }
    catch (Throwable ex) {
        //处理运行异常
        handleRunFailure(context, ex, exceptionReporters, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        //17.发布应用上下文就绪事件
        listeners.running(context);
    }
    catch (Throwable ex) {
        //处理运行异常
        handleRunFailure(context, ex, exceptionReporters, null);
        throw new IllegalStateException(ex);
    }
    //18.返回应用上下文
    return context;
}

run方法比较复杂,我们一步一步分析。
首先看第1步
创建并启动计时监控类

StopWatch stopWatch = new StopWatch();
stopWatch.start();

跳转到StopWatch来看下该类的实现

public void start() throws IllegalStateException {
    start("");
}

public void start(String taskName) throws IllegalStateException {
    if (this.currentTaskName != null) {
        throw new IllegalStateException("Can't start StopWatch: it's already running");
    }
    this.currentTaskName = taskName;
    this.startTimeMillis = System.currentTimeMillis();
}

可以看出,start()首先记录了当前任务的名称,默认为空字符串,然后记录当前 Spring Boot 应用启动的开始时间。

第2步
初始化应用上下文和异常报告集合

ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();

再看第3步
设置系统属性 java.awt.headless 的值

configureHeadlessProperty();

设置该默认值为:true,表示运行在服务器端,在没有显示器和鼠标键盘的模式下工作,模拟输入输出设备功能。说白了就是当检测没有显示器和键盘鼠标时,也运行程序启动。

第4步
创建所有 Spring 运行监听器并发布应用启动事件

SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();

我们看下getRunListeners()的实现

private SpringApplicationRunListeners getRunListeners(String[] args) {
    Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
    return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
            SpringApplicationRunListener.class, types, this, args));
}

SpringApplicationRunListeners(Log log,
        Collection<? extends SpringApplicationRunListener> listeners) {
    this.log = log;
    this.listeners = new ArrayList<>(listeners);
}

创建逻辑和之前实例化初始化器和监听器的一样,一样调用的是 getSpringFactoriesInstances 方法来获取配置的监听器名称并实例化所有的类。
SpringApplicationRunListener 所有监听器配置在 spring-boot-2.1.4.RELEASE.jar!/META-INF/spring.factories 这个配置文件里面。

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener

第5步
初始化默认应用参数类

ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);

第6步
根据运行监听器和应用参数来准备 Spring 环境

ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
configureIgnoreBeanInfo(environment);

我们看下prepareEnvironment()的实现

private ConfigurableEnvironment prepareEnvironment(
        SpringApplicationRunListeners listeners,
        ApplicationArguments applicationArguments) {
    //获取/创建应用环境
    ConfigurableEnvironment environment = getOrCreateEnvironment();
    //配置应用环境
    configureEnvironment(environment, applicationArguments.getSourceArgs());
    listeners.environmentPrepared(environment);
    bindToSpringApplication(environment);
    if (!this.isCustomEnvironment) {
        environment = new EnvironmentConverter(getClassLoader())
                .convertEnvironmentIfNecessary(environment, deduceEnvironmentClass());
    }
    ConfigurationPropertySources.attach(environment);
    return environment;
}


//获取/创建应用环境,这里分为标准 Servlet 环境和标准环境。
private ConfigurableEnvironment getOrCreateEnvironment() {
    if (this.environment != null) {
        return this.environment;
    }
    switch (this.webApplicationType) {
    case SERVLET:
        return new StandardServletEnvironment();
    case REACTIVE:
        return new StandardReactiveWebEnvironment();
    default:
        return new StandardEnvironment();
    }
}


//配置应用环境
protected void configureEnvironment(ConfigurableEnvironment environment,
        String[] args) {
    if (this.addConversionService) {
        ConversionService conversionService = ApplicationConversionService
                .getSharedInstance();
        environment.setConversionService(
                (ConfigurableConversionService) conversionService);
    }
    //1.配置 property sources
    configurePropertySources(environment, args);
    //2.配置 Profiles
    configureProfiles(environment, args);
}

第7步
创建 Banner 打印类

Banner printedBanner = printBanner(environment);

第8步
创建应用上下文

context = createApplicationContext();

我们继续看下createApplicationContext()的实现,其实就是根据不同的应用类型初始化不同的上下文应用类。

protected ConfigurableApplicationContext createApplicationContext() {
    Class<?> contextClass = this.applicationContextClass;
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
            case SERVLET:
                contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
                break;
            case REACTIVE:
                contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                break;
            default:
                contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
            }
        }
        catch (ClassNotFoundException ex) {
            throw new IllegalStateException(
                    "Unable create a default ApplicationContext, "
                            + "please specify an ApplicationContextClass",
                    ex);
        }
    }
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

第9步
准备异常报告器

exceptionReporters = getSpringFactoriesInstances(
					SpringBootExceptionReporter.class,
					new Class[] { ConfigurableApplicationContext.class }, context);

逻辑和之前实例化初始化器和监听器的一样,一样调用的是 getSpringFactoriesInstances 方法来获取配置的异常类名称并实例化所有的异常处理类。
该异常报告处理类配置在 spring-boot-2.1.4.RELEASE.jar!/META-INF/spring.factories 这个配置文件里面。

# Error Reporters
org.springframework.boot.SpringBootExceptionReporter=\
org.springframework.boot.diagnostics.FailureAnalyzers

第10步
准备应用上下文

prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
					
private void prepareContext(ConfigurableApplicationContext context,
			ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
			ApplicationArguments applicationArguments, Banner printedBanner) {
		//绑定环境到上下文
		context.setEnvironment(environment);
		//配置上下文的 bean 生成器及资源加载器
		postProcessApplicationContext(context);
		//为上下文应用所有初始化器
		applyInitializers(context);
		//触发所有 SpringApplicationRunListener 监听器的 contextPrepared 事件方法
		listeners.contextPrepared(context);
		//记录启动日志
		if (this.logStartupInfo) {
			logStartupInfo(context.getParent() == null);
			logStartupProfileInfo(context);
		}
		//注册两个特殊的单例bean
		ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
		beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
		if (printedBanner != null) {
			beanFactory.registerSingleton("springBootBanner", printedBanner);
		}
		if (beanFactory instanceof DefaultListableBeanFactory) {
			((DefaultListableBeanFactory) beanFactory)
					.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
		}
		//加载所有资源
		Set<Object> sources = getAllSources();
		Assert.notEmpty(sources, "Sources must not be empty");
		load(context, sources.toArray(new Object[0]));
		//触发所有 SpringApplicationRunListener 监听器的 contextLoaded 事件方法
		listeners.contextLoaded(context);
	}

第11步
刷新应用上下文

refreshContext(context);

private void refreshContext(ConfigurableApplicationContext context) {
    refresh(context);
    if (this.registerShutdownHook) {
        try {
            context.registerShutdownHook();
        }
        catch (AccessControlException ex) {
            // Not allowed in some environments.
        }
    }
}

第12步
应用上下文刷新后置处理

afterRefresh(context, applicationArguments);

//默认方法体是空,可以做一些自定义的后置处理操作。
protected void afterRefresh(ConfigurableApplicationContext context,
		ApplicationArguments args) {
}

第13步
停止计时监控类
计时监听器停止,并统计一些任务执行信息。

stopWatch.stop();
public void stop() throws IllegalStateException {
		if (this.currentTaskName == null) {
			throw new IllegalStateException("Can't stop StopWatch: it's not running");
		}
		long lastTime = System.currentTimeMillis() - this.startTimeMillis;
		this.totalTimeMillis += lastTime;
		this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime);
		if (this.keepTaskList) {
			this.taskList.add(this.lastTaskInfo);
		}
		++this.taskCount;
		this.currentTaskName = null;
	}

第14步
输出日志记录执行主类名、时间信息

if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}

第15步
发布应用上下文启动完成事件

listeners.started(context);

第16步
执行所有 Runner 运行器

callRunners(context, applicationArguments);

//callRunners实现
private void callRunners(ApplicationContext context, ApplicationArguments args) {
		List<Object> runners = new ArrayList<>();
		runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
		runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
		AnnotationAwareOrderComparator.sort(runners);
		for (Object runner : new LinkedHashSet<>(runners)) {
			if (runner instanceof ApplicationRunner) {
				callRunner((ApplicationRunner) runner, args);
			}
			if (runner instanceof CommandLineRunner) {
				callRunner((CommandLineRunner) runner, args);
			}
		}
	}

第17步
发布应用上下文就绪事件
触发所有 SpringApplicationRunListener 监听器的 running 事件方法。

listeners.running(context);

第18步
返回应用上下文

return context;

请关注我的订阅号

订阅号.png

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

相关推荐

【SpringBoot】27、SpringBoot中整合Ehcache实现热点数据缓存

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的CacheProvider。用惯了 Redis,很多人可能已经忘记了还有 EhCache 这么一个缓存框架 一、简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,

JACKAL 21万+

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

前言 SpringBoot作为目前最流行的 Java 开发框架,秉承“约定优于配置”原则,大大简化了 Spring MVC 繁琐的 XML 文件配置,基本实现零配置启动项目。 本文基于SpringBoot 2.1.4.RELEASE 版本,通过一步步追踪代码,详细探求 SpringBoot的运行原理。 图解 整个springboot运行流程可以由如下图表示(图来自互联网,版权归原作者所有) 入口...

CTO技术的博客 334

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1404

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

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

梧桐树的博客 1万+

Star CCM+中衍生零部件下的阈值应用与区域内删除目标网格

同样的在绘制网格结束后,有时出现负体积网格或质量差的网格,为了节约时间成本,可能会选择将负体积的网格或质量差的网格删除。弹出相应的窗口,在窗口中选择相应的区域①,选择标量函数②(此处以网格体积变化为例),选择模型③,设置阈值④,选择No Dispalyer,会根据需求选择显示,最后点击Create⑥完成创建。此处以温度为例,若出现温度异常点,首先在①栏中勾选Function,然后在下面点击⑤Select,在弹出的Function窗口中选择温度场函数,再点击④Identify,查找温度异常网格数量。

2201_75375391的博客 2222

高通camx ThreadManager

m_pCore->AcceptNewJob是将一个Job或者任务插入一个Queue,有一个工作线程循环从Queue中取Job任务执行,执行任务就是回调任务中的callback函数,AcceptNewJob实现。调用AddToPriorityQueue将任务添加到queue任务队列,那么什么时候从这个queue中取任务执行呢?有个线程循环执行DoWork,最终调用checkAndDequeue取任务执行。

GetnextWindow的专栏 435

【我的新书】一步一步学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万+

kettle实验十一:没有数据流入时停止操作

【实验目的】 1.利用Kettle的“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件,实现Kettle转换流程的控制。 2.熟练掌握“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件的使用,实现Kettle转换流程的控制。 【实验原理】 “检测空流”组件可以检测所在转换的输入数据,如果整个转换没有输入数据,通过“中止”组件终止整个转换的流程。在存在数据输入的情况,为了能让数据输出,需要和“阻塞数据直到步骤都完成”配合使用。当所有数据都已经从上个步骤“字段选择”读取完毕后,通过“阻塞数据直到步骤

weixin_44727274的博客 3847

springboot2基础运维开发实用到原理课 视频教程 下载

│ 124-实用开发篇-springboot整合ActiveMQ.mp4。│ 129-实用开发篇-springboot整合RocketMQ.mp4。│ 96-实用开发篇-SpringBoot整合Mongodb.mp4。│ 117-实用开发篇-springboot整合quartz.mp4。│ 131-实用开发篇-springboot整合Kafka.mp4。│ 90-实用开发篇-SpringBoot整合Redis.mp4。

821

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 301

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2190

2021年5月27日——SpringBoot2基础入门

SpringBoot2——基础入门 一、Spring 与 SpringBoot 1. SpringBoot优缺点 1.1 优点 创建独立Spring应用 内嵌web服务器 自动starter依赖,简化构建配置 自动配置Spring以及第三方功能 提供生产级别的监控、健康检查及外部化配置 无代码生成、无需编写XML 1.2 缺点 人称版本帝,迭代快,需要时刻关注变化 封装太深,内部原理复杂,不容易精通 2. 如何学习 官方参考文档:Spring Boot Reference Documentation

m0_47694330的博客 215

UE4/5编译报错MSB3073终极解决指南:从路径检查到MSVC版本降级

本文针对UE4/5开发中常见的MSB3073编译报错,提供了一套从根源到实战的终极解决指南。文章系统性地讲解了错误成因,并分层次指导排查路径字符、环境变量、MSVC版本兼容性、权限冲突等核心问题,重点介绍了通过降级MSVC编译器版本等关键操作来彻底解决此编译难题。

rl6adventurer的博客 1432

Log4j2-27-log4j2 与 springboot 整合例子

/</</</</</</</</</</</</</</上面log4j2是直接导入了SpringBoot对应的版本,也可以导入spring的版本,两种二选一:</</</</</</</</</</</</</</</</

1123

39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元)

Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于

weixin_45590420的博客 1161

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Qwen2-27B与Qwen2.5-27B本地部署避坑指南

大语言模型本地部署本质上是模型权重、推理引擎、硬件算力与运行时环境的系统级协同。Qwen2-27B和Qwen2.5-27B作为典型27B级开源模型,其部署难点不在模型结构本身,而在于Tokenizer变更、RoPE位置编码升级、BF16/FP16权重格式切换等底层适配问题;技术价值体现在通过AWQ量化或GGUF转换,在消费级显卡(如RTX 4090)上实现可控精度压缩与稳定推理;典型应用场景包括单机RAG服务、长文本摘要及多轮对话系统;本文聚焦真实工程约束下的可复现路径,覆盖Python版本选型、CUDA环

weixin_30263073的博客 599

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

CK3028的博客 1107

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

我要记录学习博客 1212

27.SpringBoot和SpringMVC的区别

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

郑学炜的技术博客 4万+

SpringBoot2.x系列教程汇总-从入门到精通

因为优快云没有分类归纳博客的功能,所以特写本帖汇总SpringBoot2.x系列教程,方便大家查阅! SpringBoot2.x系列教程01--史前文明之Spring简介 SpringBoot2.x系列教程02--史前文明之Spring发展史 SpringBoot2.x系列教程03--新纪元之SpringBoot初相见 SpringBoot系列教程04--新纪元之SpringBoot环境......

一一哥 1万+

第一节:创建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

springboot核心原理

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

u013262689的专栏 176

从零开始 Spring Boot 27:IoC

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

梦幻天空 824
上一篇: 27.1.从零开始学springboot-运行原理
下一篇: 28.从零开始学springboot-详解金钱类BigDecimal
码哥说
博客等级 码龄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、付费专栏及课程。

余额充值