SpringBoot:为什么 main 方法启动类 SpringApplication 需要在项目根目录

SpringBoot启动流程:从main方法到应用运行的全过程 开发者可以通过多种方式自定义SpringBoot的启动过程,如实现ApplicationContextInitializer、ApplicationListener、CommandLineRunner等接口,或者编写自定义的BeanFactoryPostProcessor和BeanPostProcessor。/*** 自定义ApplicationRunner示例*/@Component@Overridelogger.info("应用启动完成,执行初始化操作..."); 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:blog.youkuaiyun.com/u010013573/java/article/details/86685984

  • 一、概述

  • 二、注解分析

    • @SpringBootConfiguration:配置类

    • @ComponentScan:基于注解的类扫描

    • @EnableAutoConfiguration:SpringBoot的自动配置特性

  • 三、SpringApplication位于项目根目录的原因


一、概述

使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行。这是跟传统的将项目打包成war包,然后部署到tomcat服务器去运行的一个区别。

而在应用当中,这个包含main方法的启动类需要放在项目的根目录,与所有包平级,一般在main方法内部通过执行SpringApplication.run方法来启动应用。

启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三个注解组成,分别是:@SpringBootConfiguration,@ComonentScan,@EnableAutoConfiguration。所以也可以单独使用这三个注解。

一个典型的SpringBoot项目结构如下:

二、注解分析

@SpringBootConfiguration:配置类

继承于@Configuration,本身只是说明这是一个SpringBoot项目的配置类,功能与@Configuration一样,使得Spring容器知道需要跟处理@Configuration注解的类一样处理这个类。

@ComponentScan:基于注解的类扫描

用于进行包扫描,检查类是否使用了@Controller,@Service等注解,有则获取这些类创建对应的bean对象注册到Spring容器;

@EnableAutoConfiguration:SpringBoot的自动配置特性

该注解是SpringBoot引入的,用于自动配置,即基于项目配置pom.xml引入的SpringBoot的starter相关包和项目添加的配置类,判断是使用SpringBoot的starter包提供的配置类还是使用项目定义的配置类,如假如在pom.xml中引入了spring-boot-starter-data-redis包,则如果项目没有自定义RedisTemplate类实现,则SpringBoot会自动配置和注入一个RedisTemplate对象到Spring的IOC容器中。

工作过程为:扫描项目的所有包,检测项目中是否存在与SpringBoot自动添加的starter包对应功能组件类相同的类,或者实现了相同的接口或者继承了相同的父类的类,有则使用项目自身提供的该功能组件类实现,没有则使用SpringBoot自动添加的该功能组件类。SpringBoot的starter包自动添加的这些功能组件类通常是使用了@Configuration注解和@Conditional注解的,所以可以实现条件化注入。

三、SpringApplication位于项目根目录的原因

@ComponentScan注解有个特性:如果不指定需要扫描的包或者需要注册的类,则默认是扫描该使用@ComponentScan注解的类所在的包以及子包,所以将使用了@SpringBootApplication注解的包含main方法的启动类放在项目根目录,则会扫描项目的所有包。

除了@ComponentScan注解之外,@EnableAutoConfiguration注解也是扫描使用了这个注解的类所在的包及其子包,故放在项目根目录,则可以扫描项目所有的包,对所有的类(具体为使用Spring容器管理的)进行检测,从而决定是否需要自动创建功能组件类的bean对象到spring的IOC容器中。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

Cadence Virtuoso ADE L保姆级教程:从DC到Noise,一次搞定6种仿真设置 本文提供Cadence Virtuoso ADE L的全面仿真教程,涵盖DC工作点分析、瞬态响应、AC特性、零极点分布和噪声性能等6种仿真设置。通过详细的步骤和实用技巧,帮助工程师高效完成从基础配置到高级后处理的完整工作流,显著提升IC设计效率。 阅读详情

相关推荐

BK3437蓝牙5.2芯片实战:手把手教你设计超低功耗智能家居遥控器(附原理图)

本文详细介绍了BK3437蓝牙5.2芯片在超低功耗智能家居遥控器设计中的应用。通过分析芯片的核心优势、硬件设计要点和低功耗固件策略,手把手教你实现日均功耗低于5μA的遥控器原型,并附有原理图设计详解和常见问题解决方案。

tgb34567890的博客 619

SpringBoot学习(二):为什么main方法启动类SpringApplication需要在项目根目录

在基于SpringBoot的应用应用中,通常需要将包含main方法的启动类放在项目的根目录,即与所有包平级。原因主要是启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三个注解组成,分别是:@SpringBootConfiguration,@ComonentScan,@EnableAutoConfiguration。 @SpringBoo...

源码之下,了无秘密 1万+

手把手教你搞定MT6701磁编码器的SSI通信与CRC-6校验(附避坑代码)

本文详细介绍了MT6701磁编码器的SSI通信与CRC-6校验的实现方法,包括硬件连接、时序配置、数据读取和专用CRC-6算法。通过提供避坑代码和常见问题解决方案,帮助开发者快速掌握磁编芯片的调试技巧,确保通信稳定可靠。

weixin_30872337的博客 218

@SpringBootApplication的类中的main方法配置调用别的类

工作中遇到这样的需求 SpringBoot启动类加载bean失败,我配置的bean在main方法内注入失败,bean的@PostConstruct方法未执行。 这是由于bean 注入失败导致的 如图 通过 new的方式去获取bean,最后运行过程中报错空指针异常; 解决方法,通过反射的方式去获取bean; //springboot启动环境 准备spring上下文 完成容器初始化 ConfigurableApplicationContext run = SpringApplication.run(Mai.

weixin_43260335的博客 1469

Jlink除了调试还能干啥?用JFlash SPI给W25Q64烧录固件的5个实用技巧

本文深入探讨了Jlink的隐藏功能,特别是通过JFlash SPI高效烧录W25Q64的5个进阶技巧。从硬件连接优化到批量处理脚本,再到数据安全验证,这些技巧能显著提升烧录速度和稳定性,适用于量产环境。文章还提供了详细的参数配置和脚本示例,帮助工程师充分发挥Jlink的潜力。

weixin_29164843的博客 409

乐鑫WIFI芯片开发流程梳理-工具链、编译和下载

最近开始基于乐鑫ESP32的WIFI模组的软件开发,首先要做整套流程的梳理,乐鑫官网以及安信可上已经有了较为系统的资料,但是在实现过程中也遇到了一些问题,花了几天去解决,所以为了总结,也为了给其他人提供一些借鉴,把流程分享一下,官网上相对比较完善的,就不在赘述。 1. 开发方案选择 目前网上有两套较为成熟的方案: (1)基于乐鑫官网推荐的开发方式,原网页:https://docs.espress...

一名嵌入式软件工程师的自我成长 3926

SpringBoot项目的Application启动类所在目录和@SpringBootApplication注解扫描目录(简单证明版)

通过简单的测试解释Springboot项目的Application启动类所在包指哪个和@SpringBootApplication注解的扫描目录

mjnhlqk的博客 1660

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

springboot排除日志

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

风力雾里 1462

在Ubuntu系统中安装和使用wxPython进行Python图形用户界面(GUI)开发

在本文中,我将向您展示如何在Ubuntu系统上安装和使用wxPython,并提供一些示例代码来帮助您开始使用这个强大的工具。在MyFrame的构造函数中,我们创建了一个wx.Panel和一个按钮,并将按钮的点击事件绑定到一个自定义的方法on_button_click上。最后,我们创建了一个wx.App的实例,创建了一个MyFrame对象并显示它,最后通过调用app.MainLoop()启动应用程序的主事件循环。这只是一个简单的示例,但它演示了如何使用wxPython创建一个基本的GUI应用程序。

qq_37934722的博客 1040

安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案

本文主要介绍了安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案,希望能对使用Windows WSL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

IDEA运行SpringBootApplication.main()报错

IDEA运行SpringBootApplication.main()报错 错误信息如下: Command line is too long. Shorten command line for SpringBootMainApplication or also for App; 解决方法: 在.idea\workspace.xml文件的"PropertiesComponent"标签里新增<property name="dynamic.classpath" value="true" />;

u800820的专栏 480

[dprecated]第五章:TTM分析: 5.1 TTM设计目标和核心概念

TTM是Linux DRM框架下的通用显存管理模块,其复杂性源于需要满足多样化的显存管理需求。该文解析了TTM的核心结构体及其关系:ttm_device作为顶层管理者,包含多个ttm_resource_manager处理不同类型内存;ttm_buffer_object为核心对象,通过ttm_resource关联物理资源;其他组件如ttm_tt管理页表、ttm_pool优化分配效率。文章强调理解这些结构体关系是掌握TTM机制的基础,并建议国产芯片开发者参考这些功能需求。

图形/计算GPU的驱动与虚拟化技术分享园地 2128

SpringBoot:为什么main方法启动类SpringApplication需要在项目根目录

原文链接:https://blog.csdn.net/u010013573/java/article/details/86685984一、概述使用SpringBoot的应用是需要将应用代...

JAVA葵花宝典 1053

假人有限元模型

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

VB摄像头监控

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

SpringBoot浅析——Springboot启动类(一)

Springboot启动类run方法 前言 在我们新建的springboot(2.3.3版本)项目中,我们可以通过运行项目的启动类来启动我们的项目。那么启动的原理究竟是怎样的呢?今天我们就来学习一下 SpringApplication.run() 打开我们的启动类文件,我们会看到有一个main方法: @SpringBootApplication public class SprintApplication { public static void main(String[] args) { // 启动

ly1822290618的博客 897

温度PID控制PLC程序

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

springboot启动类springApplication与注解解析

springboot的main方法3种启动方式 第一种 第二种 可以看到tomcat的启动端口为54155 第三种,使用bulider模式 @SpringBootApplication注解和springApplication.run方法运行main方法来启动spring容器或者tomcat容器。那么springboot启动的原理是什么? 以上三种方法都是使用spr...

YZX2018的博客 1671

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

springboot项目的启动类

springboot项目的启动类 springboot启动类 springboot框架和之前所有的spring框架不同的是,它简化了很多复杂的xml配置,和Tomcat配置等,在pom.xml文件中 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version&g.

Junibl1231的博客 5244

第 4 节 基于 main 方法启动 SpringBoot 进程

1 静态 main 方法与 JVM 进程的关系 ​ 在讲解 SpringBoot 项目的启动和运行之前,首先分析一下基于静态 main 方法启动运行 Java 类的相关知识,以便读者能够更好理解基于 SpringBoot 框架搭建的项目的启动和运行方式。 1.1 基于静态 main 方法执行 Java 类 ​ Java 类的静态 main 方法是每一个 Java 开发人员都再熟悉不过的一个方法,在进行 Java 应用程序开发,特别是 Java SE 应用程序开发时,一般都会在 Java 类定义一个静态 ma

源码之下,了无秘密 3127

springboot 启动类的过程

总结来说,启动类的过程是通过@SpringBootApplication注解标记启动类,然后在main方法中调用SpringApplication.run()方法来启动Spring Boot应用程序。Spring Boot将扫描你的类路径,自动配置必要的组件,并启动内嵌的Web服务器(如Tomcat或Jetty),从而使应用程序可以响应HTTP请求。执行自定义配置:除了自动配置外,你还可以在应用程序中编写自定义的配置类或配置文件,通过这些配置,你可以进一步定制和扩展应用程序的行为。

qq_43406318的博客 1356

【Springboot】介绍启动类和启动过程

(1)​作用​:表明当前类是一个配置类。它的底层是 @Configuration,这意味着Spring容器会从该类中加载Bean定义(@Bean注解的方法)。(2)​为什么不用 @Configuration​:@SpringBootConfiguration是Spring Boot提供的,语义上更明确地指出这是主配置类,但在功能上与 @Configuration无异。

weixin_44823875的博客 1424

1.4、设置 SpringApplication 主启动类

1、正文 代码很简单,不做过多赘述,直接看源码和注释 源码: initialize  |- setListeners  |- setListeners  |- deduceMainApplicationClass private void initialize(Object[] sources) { 略... this.mainApplicationClass = deduceMainApplicationClass(); } deduceMainApplicat

javaThinker的专栏 467

SpringBoot启动类源码分析

目录二. SpringBoot启动类源码分析 二. SpringBoot启动类源码分析 一个基础的SpringBoot项目启动类,执行main方法中调用SpringApplication的run方法 @SpringBootApplication public class App{ public static void main(String[] args) { SpringApplication.run(App.class,args);; } } 在 SpringAp

qq_29799655的博客 384

springboot系列文章之SpringApplication详解

前言 还是从SpringBoot的启动类说起,这篇文章主要分析启动类中的SpringApplication @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.cla...

pjmike的博客 782

SpringBoot源码解析(一):启动流程之SpringApplication构造方法

SpringApplication的实例化:通过调用方法,首先会创建一个SpringApplication的实例。推断应用类型:根据类路径下的相关类,推断出当前应用是Web应用(包括Servlet和Reactive两种类型)还是非Web应用。加载初始化器和监听器:从文件中读取并实例化所有的ApplicationContextInitializer和ApplicationListener。推断启动类:推断出包含main方法的启动类。准备环境。

陈辰学长的博客 691

main run方法没用_Springboot之main函数详解

此前一直好奇,为什么Springboot的main函数只有简单的一行,它的资源加载,bean的加载和初始化究竟是怎么执行的?今天跟大家一块分析下源码,一探究竟。 如下图所示:图1 main函数 如图所示, 整个初始启动类中,只有一个@SpringBootApplication的注解,用于标识这个是系统的入口类。它其实是一个组合注解,包含了EnableAutoConfiguration(排除自动...

weixin_39851872的博客 1356
上一篇: 是时候,肝一波设计模式了!
下一篇: 字节一面,面试官拿 System.out.println() 考了我半个小时?我傻了
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值