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

SpringBoot3依赖管理,自动配置

文章目录

    • 1. 项目新建
    • 2. 相关pom依赖
    • 3. 依赖管理机制
      • 导入 starter 所有相关依赖都会导入进来
      • 为什么版本号都不用写?
      • 如何自定义版本号
      • 第三方的jar包
    • 4. 自动配置机制
    • 5. 核心注解


1. 项目新建

  • 直接建Maven项目
  • 通过官方提供的Spring Initializr项目创建
    在这里插入图片描述

2. 相关pom依赖

    <!--    所有springboot项目都必须继承自 spring-boot-starter-parent --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent><dependencies><!--        web开发的场景启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!--    SpringBoot应用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3. 依赖管理机制

在这里插入图片描述

导入 starter 所有相关依赖都会导入进来

  • 需要开发什么场景就导入什么场景启动器
  • Maven依赖传递原则。A-B-C,A依赖B,B依赖C,则A也依赖了C
  • 导入场景启动器,场景启动器会自动把这个场景的所有核心依赖全部导入进来

为什么版本号都不用写?

  • 每个boot项目都有一个父项目 spring-boot-starter-parent
  • parent的父项目是 spring-boot-dependencies
  • 父项目具有 版本仲裁中心,会把所有常见的jar的依赖版本都声明好了,例如:mysql-connector-j

如何自定义版本号

  • 利用maven的就近原则
    • 直接在当前项目properties标签中声明父项目的版本属性的key
    • 直接在导入依赖的时候声明版本

第三方的jar包

  • boot父项目没有管理的需要自行声明好,例如:
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.16</version></dependency>

4. 自动配置机制

  • 自动配置的 Tomcat、SpringMVC 等
    • 导入场景,容器中就会自动配置好这个场景的核心组件。
    • 以前:DispatcherServlet、ViewResolver、CharacterEncodingFilter…
    • 现在:自动配置好的这些组件
  • 验证:容器中有了什么组件,就具有什么功能
public class Boot302DemoApplication {public static void main(String[] args) {// Java10:局部变量类型的自动推断var ioc = SpringApplication.run(Boot302DemoApplication.class, args);// 1、获取容器中所有组件的名字String[] names = ioc.getBeanDefinitionNames();// 2、遍历查看// SpringBoot把以前配置的核心组件现在都自动配好了for (String name:names) {System.out.println(name);}}}
  • 默认扫描规则

    • @SpringBootApplication 标注的累就是主程序类
    • SpringBoot只会扫描主程序所在的包及其下面的子包,自动的componet-scan功能
    • 自定义扫描路径
      • @SpringBootApplication(scanBasePackages = “com.xxx”) 指定即可
      • @ComponentScan(“com.xxx”) 直接指定扫描的路径
  • 配置默认值

    • 配置文件的所有配置项是和某个类的对象值进行一一绑定
    • 绑定了配置文件中每一项值的类:配置属性类
    • 比如:
      • ServerProperties类绑定了所有Tomcat服务器有关的配置
      • MultipartProperties类绑定了所有文件上床相关的配置
      • …参照官方文档 或者参照绑定的属性类
  • 按需加载自动配置

    • 导入场景spring-boot-starter-web
    • 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter,是所有starter的starter,基础核心starter
    • spring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
    • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。
      • 导入哪个场景就开启哪个自动配置

总结 导入场景启动器、触发 spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相关场景的功能


5. 核心注解

@ConditionalOnXxx
@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为

场景:
● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
● 否则,就给容器中放一个Dog组件,名dog01
● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan 
● 否则,就放一个User,名叫lisi

@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

http://www.lryc.cn/news/366063.html

相关文章:

  • 音视频开发17 FFmpeg 音频解码- 将 aac 解码成 pcm
  • vue2中封装图片上传获取方法类(针对后端返回的数据不是图片链接,只是图片编号)
  • 【C++面向对象编程】(二)this指针和静态成员
  • 最大矩形问题
  • LeetCode62不同路径
  • GNU Radio实现OFDM Radar
  • 东方博宜1760 - 整理抽屉
  • react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目
  • 使用python绘制核密度估计图
  • 5. MySQL 运算符和函数
  • Linux学习之vi文本编辑器的使用
  • 【数据结构】链表与顺序表的比较
  • dart 基本语法
  • 【经验分享】嵌入式入坑经历(选段)
  • Docker面试整理-Docker与虚拟机的区别是什么?
  • Java:JDK8 GC中ParNew和CMS的问题说明
  • 学单片机前先学什么?
  • 数据可视化:Matplotlib 与 Seaborn
  • 【linux】自定义快捷命令/脚本
  • 使用onnxruntime加载YOLOv8生成的onnx文件进行目标检测
  • QT 信号和槽 一对多关联示例,一个信号,多个槽函数响应,一个信号源如何绑定多个槽函数
  • C++ AVL树 详细讲解
  • Faster R-CNN:端到端的目标检测网络
  • 如何给 MySQL 表和列授予权限?(官方版)
  • 攻防世界testre做法(考点:base58)
  • 计算机视觉与模式识别实验1-1 图像的直方图平衡
  • 【C++课程学习】:C++入门(函数重载)
  • skywalking介绍及搭建
  • 分析示例 | Simufact焊接工艺仿真变形精确预测汽车结构
  • 模式识别选择题