黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录

1 配置优先级

2 Bean的管理

2.1 Bean的作用域

2.2 第三方Bean

3 SpringBoot原理

3.1 起步依赖

3.2 自动配置

3.2.1 实现方案

3.2.2 原理分析

3.2.3 自定义starter


1 配置优先级

SpringBoot项目当中支持的三类配置文件:

  • application.properties
  • application.yml ❤
  • application.yaml

配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件

虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。(yml是主流)

2 Bean的管理

2.1 Bean的作用域

IOC容器当中,默认bean对象是单例的 (只有一个实例对象),可以借助Spring中的@Scope注解来进行配置作用域。

作用域说明
singleton容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(非单例)
  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的bean是单例的,也就是说绝大部分bean不需要配置scope属性。
面试题 1:Spring 容器的 bean 是单例的还是多例的?单例的 bean 是什么时候实例化的?默认是单例的单例的 bean,默认是项目启动时实例化的(通过 @Lazy 可以延迟初始化)

面试题 2:Spring 容器的 bean 是线程安全的吗?bean 的线程安全取决于 bean 的状态及 bean 的作用域单例 bean:如果是无状态的 bean,内部不保存任何状态信息,则是线程安全的。单例 bean:如果是有状态的 bean,内部会保存状态信息,多个线程会同时操作该 bean 时,可能会出现数据不一致的问题,这样的 bean 则是线程不安全的。

2.2 第三方Bean

之前我们所配置的bean,像controller、service,dao三层体系下编写的类,这些类都是我们在项目当中自己定义的类(自定义类)。当我们要声明这些bean,也非常简单,我们只需要在类上加上@Component以及它的这三个衍生注解(@Controller@Service@Repository),就可以来声明这个bean对象了。

但是在我们项目开发当中,还有一种情况就是这个类它不是我们自己编写的,而是我们引入的第三方依赖当中提供的,那么此时我们是无法使用 @Component 及其衍生注解来声明bean的,此时就需要使用@Bean注解来声明bean 了。

若要管理的第三方 bean 对象,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。【推荐】

package com.itheima.config; import com.itheima.utils.AliyunOSSOperator; import com.itheima.utils.AliyunOSSProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OSSConfig { @Bean public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties ossProperties) { return new AliyunOSSOperator(ossProperties); } }

3 SpringBoot原理

3.1 起步依赖

起步依赖的原理就是Maven的依赖传递。

  • 在SpringBoot给我们提供的这些起步依赖当中,已提供了当前程序开发所需要的所有的常见依赖(官网地址:https://docs.spring.io/spring-boot/docs/2.7.7/reference/htmlsingle/#using.build-systems.starters)。
  • 比如:springboot-starter-web,这是web开发的起步依赖,在web开发的起步依赖当中,就集成了web开发中常见的依赖:json、web、webmvc、tomcat等。我们只需要引入这一个起步依赖,其他的依赖都会自动的通过Maven的依赖传递进来。

3.2 自动配置

3.2.1 实现方案

方案一:思考:引入进来的第三方依赖当中的bean以及配置类为什么没有生效?

  • 原因在我们之前讲解IOC的时候有提到过,在类上添加@Component注解来声明bean对象时,还需要保证@Component注解能被Spring的组件扫描到。
  • SpringBoot项目中启动类的@SpringBootApplication注解,具有包扫描的作用,但是它只会扫描启动类所在的当前包以及子包。
  • 当前包:com.itheima, 第三方依赖中提供的包:com.example(扫描不到)

那么如何解决以上问题的呢?

  • 方案1:@ComponentScan 组件扫描(繁琐、性能低)
  • 方案2:@Import 导入(使用@Import 导入的类会被Spring加载到IOC容器中)❤

方案二:@Import导入,主要有以下几种:

  • 导入普通类
  • 导入配置类
  • 导入ImportSelector接口实现类

如果基于以上方式完成自动配置,当要引入一个第三方依赖时,是不是还要知道第三方依赖中有哪些配置类和哪些Bean对象?答案:是的。 (对程序员来讲,很不友好,而且比较繁琐)

结论:我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定。

怎么让第三方依赖自己指定bean对象和配置类?

答案:比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以@EnableXxxx开头的注解,注解中封装的就是@Import注解

  • 使用第三方依赖提供的 @EnableXxxxx注解(方便 优雅)❤

3.2.2 原理分析

在@SpringBootApplication注解中包含了:

1.元注解(不再解释)

2.@SpringBootConfiguration

该改注解上使用了@Configuration,表明SpringBoot启动类就是一个配置类

3.@EnableAutoConfiguration(自动配置核心注解)

  • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)。
  • 在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。
  • 当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器中,交给IOC容器管理。

4.@ComponentScan

用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。

问题:在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中定义的配置类非常多,而且每个配置类中又可以定义很多的bean,那这些bean都会注册到Spring的IOC容器中吗?
答案:并不是。 在声明bean对象时,上面有加一个以 @Conditional 开头的注解,这种注解的作用就是按照条件进行装配,只有满足条件之后,才会将bean注册到Spring的IOC容器中。

3.2.3 自定义starter

所谓starter指的就是SpringBoot当中的起步依赖。在SpringBoot当中已经给我们提供了很多的起步依赖了,我们为什么还需要自定义 starter 起步依赖?

这是因为在实际的项目开发当中,我们可能会用到很多第三方的技术,并不是所有的第三方的技术官方都给我们提供了与SpringBoot整合的starter起步依赖,但是这些技术又非常的通用,在很多项目组当中都在使用。

业务场景:

  • 我们前面案例当中所使用的阿里云OSS对象存储服务,现在阿里云的官方是没有给我们提供对应的起步依赖的,这个时候使用起来就会比较繁琐,我们需要引入对应的依赖。我们还需要在配置文件当中进行配置,还需要基于官方SDK示例来改造对应的工具类,我们在项目当中才可以进行使用。
  • 大家想在我们当前项目当中使用了阿里云OSS,我们需要进行这么多步的操作。在别的项目组当中要想使用阿里云OSS,是不是也需要进行这么多步的操作,所以这个时候我们就可以自定义一些公共组件,在这些公共组件当中,我就可以提前把需要配置的bean都提前配置好。将来在项目当中,我要想使用这个技术,我直接将组件对应的坐标直接引入进来,就已经自动配置好了,就可以直接使用了。我们也可以把公共组件提供给别的项目组进行使用,这样就可以大大的简化我们的开发。

在SpringBoot项目中,一般都会将这些公共组件封装为SpringBoot当中的starter,也就是我们所说的起步依赖。

而在springboot中,官方提供的起步依赖 或 第三方提供的起步依赖,基本都会包含两个模块,如下所示:

其中,spring-boot-starter  或  xxx-spring-boot-starter 这个模块主要是依赖管理的功能。 而 spring-boot-autoconfigure 或 xxxx-spring-boot-autoconfigure 主要是起到自动配置的作用,自动配置的核心代码就在这个模块中编写。

SpringBoot官方starter命名: spring-boot-starter-xxxx

第三组织提供的starter命名: xxxx-spring-boot-starter

而自动配置模块的核心,就是编写自动配置的核心代码,然后将自动配置的核心类,配置在核心的配置文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中。

Read more

深入解析PX4无人机仿真(2) —— Offboard模式下的精准定点控制

1. Offboard模式基础概念 Offboard模式是PX4飞控中一种特殊的飞行模式,它允许外部系统通过MAVLink协议直接控制无人机的位置、速度或姿态。与传统的遥控器控制不同,Offboard模式下飞控完全依赖外部计算机发送的指令,这使得开发者可以实现复杂的自主飞行算法。 我第一次接触Offboard模式时,最大的困惑是它与其他自主飞行模式(如Mission模式)的区别。简单来说,Mission模式是预先规划好航点让无人机自动执行,而Offboard模式则是实时控制,更适合需要动态响应的场景。比如在目标跟踪、编队飞行等应用中,Offboard模式就是最佳选择。 在硬件连接上,Offboard控制通常通过机载计算机(如树莓派)或地面站实现。我常用的方案是使用ROS系统中的MAVROS包作为中间件,它提供了丰富的ROS接口与PX4通信。这里有个容易踩坑的地方:Offboard模式下必须保持2Hz以上的指令发送频率,否则飞控会触发失控保护。曾经有一次测试时因为网络延迟导致指令间隔过长,无人机突然切回Stabilized模式,差点酿成事故。 2. MAVROS通信机制详解

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AI绘画 文章目录 * 💯前言 * 💯DALL·E 3 图像生成介绍 * 图像质量与分辨率 * 图像生成机制的解析 * 多图生成功能 * 💯使用 DALL·E 编辑器界面 * 实际应用 * 编辑器的实用建议 * 💯DALL·E API 的探索 * 获取API Key的基本步骤 * API 功能概览 * 实际应用场景 * 使用注意事项 * 最佳实践 * 💯小结 💯前言 DALL·E 3 是 OpenAI 最新的图像生成技术,通过对文本描述的深度理解和生成对抗网络(GANs)的应用,能够快速生成高质量、细节丰富的图像。本文将从图像生成机制、分辨率与格式选择、多图生成功能、编辑器界面操作及 API 的使用等多个方面,

目标检测数据集——无人机视觉VisDrone数据集

目标检测数据集——无人机视觉VisDrone数据集

随着无人机技术的飞速发展,无人机在航拍、监控、农业、物流等领域的应用日益广泛。与此同时,无人机视角下的视觉任务,如目标检测、目标跟踪和场景理解,也成为了计算机视觉研究的热点。然而,相比传统的地面视角数据集,无人机视角下的图像具有高度变化、小目标密集、复杂背景等独特挑战,这对现有算法提出了更高的要求。 为了应对这些挑战并推动无人机视觉技术的发展,天津大学机器学习与数据挖掘实验室推出了 VisDrone数据集。作为一个大规模、标注精细的无人机视觉数据集,VisDrone 不仅涵盖了丰富的场景和多样化的目标类别,还为研究人员提供了一个极具挑战性的测试平台。无论是小目标检测的精度提升,还是密集场景下的鲁棒性优化,VisDrone 都成为了学术界和工业界不可或缺的资源。该数据集采集自中国14个不同城市,覆盖复杂城市场景、交通枢纽、密集人群等多种环境。 VisDrone官方Github下载渠道可点击访问: https://github.com/VisDrone/VisDrone-Dataset?tab=readme-ov-file 下载的数据集为VisDrone2019-DET-train

融合满足多种条件:基于无人机的多模态目标检测的高多样性基准和基线

大家读完觉得有帮助记得关注和点赞!!! 摘要 (Abstract) 基于无人机(UAV)的可见光(RGB)与红外(IR)图像融合目标检测,借助深度学习技术的进步和高质量数据集的推动,实现了全天候的鲁棒检测。然而,现有数据集难以充分捕捉真实世界的复杂性,因其成像条件受限。为此,我们提出了一个高多样性数据集 ATR-UMOD,覆盖多样场景,飞行高度从 80m 到 300m,相机角度从 0° 到 75°,并包含全天候、全年份的时间变化,涵盖丰富的天气和光照条件。此外,每对 RGB-IR 图像标注了 6 个条件属性,提供有价值的高层上下文信息。 为应对如此多样条件带来的挑战,我们提出了一种新颖的 提示引导的条件感知动态融合(PCDF) 方法,利用标注的条件线索自适应地重新分配多模态贡献。通过将成像条件编码为文本提示,PCDF 通过任务特定的软门控变换,有效建模了条件与多模态贡献之间的关系。一个提示引导的条件解耦模块进一步确保了在无标注条件下的实际可用性。在 ATR-UMOD