当前位置: 首页 > news >正文

Spring Boot -- 学习记录Day3

引导类

定义

Spring Boot 的引导类(也叫启动类 / 主类) 是整个 Spring Boot 项目的「入口」和「核心开关」—— 所有 Spring Boot 项目都必须有且仅有一个引导类,它负责启动 Spring 容器、加载自动配置、初始化整个应用。

代码示例

下面是一个Spring Boot 引导类基本结构

// 核心注解:标记这是 Spring Boot 应用的引导类@SpringBootApplicationpublicclassDemo1Application{// 主方法:Java 程序的入口,也是 Spring Boot 启动的入口publicstaticvoidmain(String[]args){// 启动 Spring Boot 应用,加载上下文、初始化容器SpringApplication.run(Demo1Application.class,args);}}
  1. @SpringBootApplication
    @SpringBootApplication 是一个「组合注解」(由下面3个核心注解组合而成)
  • @SpringBootConfiguration:标记这是一个配置类,说明这个类可以定义Bean
  • @EnableAutoConfiguration:开启自动配置;自动识别场景(比如引入了 Web Starter),自动配置相关组件(比如 Tomcat、DispatcherServlet),不用手动写 XML/Java 配置
  • @ComponentScan:组件扫描;自动扫描当前包及其子包下的「组件类」(比如 @Controller、@Service、@Repository、@Component 注解的类),并把这些类交给 Spring 容器管理
  • @ComponentScan 的扫描范围:默认是「引导类所在包 + 所有子包」。比如引导类在 com.example.demo1 包下,那么 com.example.demo1.controller、com.example.demo1.service 都会被扫描;如果组件类放在 com.example.other 包下,需要手动指定扫描范围:
@SpringBootApplication(scanBasePackages="com.example")// 扫描 com.example 下所有包// 或指定具体包@SpringBootApplication(scanBasePackages={"com.example.demo1","com.example.other"})
  1. SpringApplication.run ()
  • 初始化 Spring 容器:创建 ApplicationContext(Spring 上下文),这是 Spring 管理所有 Bean 的核心容器;
  • 加载自动配置:根据 @EnableAutoConfiguration 扫描并加载所有 Starter 的自动配置类(比如 Web Starter 的 WebMvcAutoConfiguration);
  • 扫描并注册组件:根据 @ComponentScan 扫描组件,把 @Controller、@Service 等类注册到容器中;
  • 启动内嵌服务器:如果引入了 Web Starter,自动启动内置 Tomcat(默认端口 8080);
  • 监听应用事件:触发应用启动的各个生命周期事件(比如启动前、启动后)。

学习疑惑

Bean

// 定义一个服务类publicclassUserService{publicStringsayHello(){return"Hello World";}}// 使用时手动new对象publicclassTest{publicstaticvoidmain(String[]args){UserServiceuserService=newUserService();// 手动创建对象System.out.println(userService.sayHello());}}
  • 如果你要创建一个 Service 类的对象,需要手动 new。但是如果项目里面有很多个类,手动 new 会导致代码混乱,还难管理依赖。
// 加 @Service 注解 → 告诉 Spring:这个类是 Bean,交给你管理@ServicepublicclassUserService{publicStringsayHello(){return"Hello World";}}// 控制器中使用 Bean(不用 new,直接注入)@RestControllerpublicclassUserController{// @Autowired:告诉 Spring 容器“把 UserService 这个 Bean 递给我”@AutowiredprivateUserServiceuserService;@GetMapping("/hello")publicStringhello(){// 直接用容器管理的 Bean,不用自己 newreturnuserService.sayHello();}}

Spring Boot 中的 Bean,只需要给类加特定注解,Spring 容器就会自动创建、管理这个类的对象(这个对象就是 Bean)。

哪些类会被 Spring 识别为 Bean?
Spring Boot 中,只要加了以下注解的类,都会被 扫描并注册为 Bean(引导类的核心功能之一):
@Controller:控制器(处理接口请求)
@Service:服务类(处理业务逻辑)
@Repository:数据访问类(操作数据库,比如 Mapper)
@Component:通用组件(以上注解的父注解)
@Configuration:配置类(比如定义 @Bean 方法)

spring容器

Spring 容器(核心是 ApplicationContext)是一个 “智能管家”,它的核心工作就是:
(1)创建 Bean
启动 Spring Boot 时(引导类的 SpringApplication.run()),容器会扫描所有加了注解的类,自动创建这些类的对象(不用你 new)。
(2)管理 Bean 的依赖
比如 UserController 里需要 UserService,容器会自动把 UserService Bean 注入到 UserController 中(@Autowired 就是干这个的),解决类之间的依赖问题。
(3)控制 Bean 的生命周期
从 Bean 的创建 → 初始化 → 使用 → 销毁,全由容器把控(比如可以通过 @PostConstruct 注解指定 Bean 初始化后执行的方法)。
(4)加载配置
容器会加载 Starter 提供的自动配置类(比如 Web Starter 的 Tomcat 配置)、application.yml 中的自定义配置,让 Bean 按规则运行。

组件之间的关联
parent:统一依赖版本,确保容器能识别所有 Starter 引入的类(比如 Tomcat、Spring MVC);
Starter:引入功能依赖,同时提供自动配置类(告诉容器该怎么创建这些依赖的 Bean,比如 Tomcat Bean、DispatcherServlet Bean);
引导类:启动时创建 Spring 容器,扫描你的业务类(@Controller/@Service)并注册为 Bean,最终让所有 Bean 协同工作。

实操验证

@SpringBootApplicationpublicclassDemo1Application{publicstaticvoidmain(String[]args){// 启动容器并获取上下文对象ConfigurableApplicationContextcontext=SpringApplication.run(Demo1Application.class,args);// 打印所有 Bean 的名称String[]beanNames=context.getBeanDefinitionNames();for(StringbeanName:beanNames){System.out.println("Bean 名称:"+beanName);}}}

parent ,starter 和引导类的关系

http://www.jsqmd.com/news/505669/

相关文章:

  • 设计与实现】基于STC12C5A60S2的智能鱼缸控制系统:温控、LED照明、投喂与水循环
  • ChatTTS最新模型解析:从架构设计到生产环境部署指南
  • 手把手教你解决labelimg安装后无法运行的问题(附常见错误排查)
  • 逆向工程实战:XXTEA算法解密与混淆处理
  • 3步极速汉化:让Android Studio告别语言障碍,提升开发效率
  • Blender新手必看:3种超简单模型环绕技巧(附常见问题解决)
  • 前端·小白也能看懂系列:3D魔方旋转相册
  • Blender3mfFormat技术方案实战:3D打印全流程解决方案
  • Navicat连接Oracle闪退?3步搞定OCI配置(附最新Instant Client下载)
  • WeChatExporter终极指南:三步完成iOS微信聊天记录完整备份与查看
  • 戴森球计划工厂蓝图库:从新手到专家的终极效率提升方案
  • 企业级CosyVoice语音方案部署:高可用架构与网络安全考量
  • SPH流体模拟实战:如何用哈希表优化邻域搜索(附完整C++代码)
  • 力扣第80题:划分字母区间
  • Oracle VM VirtualBox报错VERR_SUPDRV_NO_RAW_MODE?三分钟搞定ENSP和Docker的共存难题
  • 基于单片机的自动窗控制系统设计
  • 预防胜于治疗:给你的RStudio Server设置自动清理session,告别启动卡死
  • 蓝桥题目回顾2
  • CSDN-推荐开源项目-auto-x-to-wechat
  • 实战对比:OpenCV中RANSAC与最小二乘法在图像误匹配剔除中的性能差异
  • KOOK艺术馆入门指南:无需Python基础的Streamlit艺术画廊启动
  • HiC-Pro实战:从零到一构建上游数据处理环境
  • ComfyUI新手必看:如何用Easy-Use插件5分钟搞定你的第一个AI图像生成工作流
  • SE模块在CV中的实战解析:从理论到PyTorch实现
  • C语言概述
  • nodejs+vue基于springboot的公益慈善捐赠平台管理信息系统设计与
  • vLLM-v0.11.0实战体验:加载LoRA,微调模型推理如此简单
  • Redis中是如何实现分布式锁的
  • Prompt优化实战:5分钟用遗传算法搞定ChatGPT摘要生成(附完整代码)
  • C#实战:5分钟搞定USB设备信息读取(HidSharp vs LibUsbDotNet对比)