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

Spring Boot从0到1 -day02

目录

  • 学习目标
  • Spring Boot 的基本配置
    • 启动类与核心注解@SpringBootApplication
    • Spring Boot 的全局配置文件
      • 1. application.properties
      • 2. application.yml
      • Spring 中@Spring Boot Application注解的作用
  • 自动配置原理
      • 1. 自动配置类
      • 2. 自动配置的发现
      • 示例
      • 3. 自定义自动配置
  • 条件注解
      • 使用场景
  • 总结

学习目标

Spring Boot 核心

  • Spring Boot 的基本配置
  • 自动配置原理
  • 条件注解

Spring、Spring MVC和Spring Boot之间的关系可以这样理解:

Spring是一个全面的框架,提供了核心功能,如依赖注入和事务管理。Spring
MVC是Spring的一部分,专注于构建基于MVC模式的Web应用。Spring
Boot则是基于Spring的工具,使得开发新Spring应用变得更加简单和快速,通过自动配置和约定优于配置的方式来减少开发者的工作量。


Spring Boot 的基本配置

启动类与核心注解@SpringBootApplication

在 Spring Boot 中,@SpringBootApplication 是一个核心注解,通常用于标记启动类。它实际上是一个组合注解,包含了多个其他的 Spring 注解.主要有:

  1. @SpringBootConfiguration:表示这是一个 Spring 配置类,可以包含 @Bean 方法,用来定义 bean的实例化。这个注解是 @Configuration 的别名。

  2. @ComponentScan:用于开启组件扫描,可以指定要扫描的包路径,默认情况下会扫描

  3. @EnableAutoConfiguration:启用自动配置功能,Spring Boot 会根据类路径中可用的jar包来自动配置bean,例如如果检测到 Tomcat,则会自动配置嵌入式的Tomcat。也可以通过排除某些自动配置类来定制自动配置行为。

在这里插入图片描述

Spring Boot 的全局配置文件

Spring Boot 支持多种配置文件格式,其中最常用的是 application.propertiesapplication.yml 文件。
一般位于s’r’csrc->main->resources
在这里插入图片描述

1. application.properties

application.properties 文件是一个纯文本文件,其中每个配置项都是键值对的形式,键和值之间使用等号(=)或者冒号(:)分隔。例如:

# application.properties
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password

2. application.yml

application.yml 文件使用 YAML 格式,它可以更好地组织配置信息,使其看起来更加清晰。例如:

# application.yml
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password

YAML 格式支持嵌套结构,因此可以更容易地组织和阅读配置信息。


Spring 中@Spring Boot Application注解的作用

@SpringBootApplication 注解是 Spring Boot 中的关键注解之一,它通过整合多个注解的功能,简化了应用程序的创建过程。

简化配置:通过自动配置和组件扫描,减少手动配置的工作量。
自动配置:根据类路径中的 jar 包自动配置组件和服务。
组件扫描:自动发现并装配带有特定注解的类。
配置类:允许在配置类中定义 bean。


在这里插入图片描述

Spring官方文档提供了一个非常详尽的资源库,涵盖了Spring框架及其衍生项目(如Spring Boot)的全面指南。

对于全局配置文件以及Spring Boot的配置细节,你可以直接访问Spring官方网站上的文档部分来获取最新和最权威的信息。

以下是 Spring Boot 和 Spring Framework 的官方文档链接:

  • Spring Boot 官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/
  • Spring Framework 官方文档: https://docs.spring.io/spring-framework/docs/current/reference/html/

自动配置原理

Spring Boot 的自动配置原理是其一大特色之一,它通过一系列机制使得开发者能够快速搭建应用,而无需过多关注配置细节。

1. 自动配置类

自动配置的核心在于一系列自动配置类,这些类通常位于 org.springframework.boot.autoconfigure 包及其子包内。每个自动配置类负责一个特定的功能领域,如数据库连接、日志记录、安全等。自动配置类通常使用 @EnableAutoConfiguration 注解来启用。
在这里插入图片描述

2. 自动配置的发现

Spring Boot 使用 @EnableAutoConfiguration 注解来启用自动配置功能。这个注解本身并不做任何事情,而是通过 SpringFactoriesLoader 机制来加载所有的自动配置类。SpringFactoriesLoader 会从 META-INF/spring.factories 文件中读取自动配置类的全限定名,并加载它们。

在 Spring Boot 启动过程中,AutoConfigurationImportSelector 被用来选择合适的自动配置类,并将其导入到 Spring 应用上下文中。
在这里插入图片描述
被 @EnableAutoConfiguration 触发:
当我们在 Spring Boot 应用的主类上使用 @SpringBootApplication 或 @EnableAutoConfiguration 注解时,Spring Boot 会触发自动配置机制。@EnableAutoConfiguration 注解实际上是一个元注解,它内部使用了 @Import(AutoConfigurationImportSelector.class) 来导入 AutoConfigurationImportSelector。


示例

假设我们有一个简单的 Spring Boot 应用,使用嵌入式 Tomcat 作为服务器:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args ) {
        SpringApplication.run(Application.class, args);
    }
}

org.springframework.boot.autoconfigure.web 包中,有一个名为 TomcatAutoConfiguration 的自动配置类,它负责配置嵌入式的 Tomcat 服务器。这个类会使用 @ConditionalOnClass 来检查是否有 Tomcat 类库,使用 @ConditionalOnMissingBean 来决定是否需要创建一个新的 Tomcat 实例等。

3. 自定义自动配置

如果你需要为自己的组件或库添加自动配置支持,可以自己编写自动配置类,并遵循上述模式。你需要:

  • 创建一个自动配置类,并使用适当的条件注解。
  • 使用 @Bean 方法来定义 bean。
  • 如果需要绑定配置属性,可以使用 @ConfigurationProperties 注解。

条件注解

条件注解(Conditional Annotations)是 Spring 框架中用于控制 Bean 创建的重要工具。这些注解允许你在不同的条件下有条件地注册或不注册 Bean,从而实现灵活的配置。在 Spring Boot中,条件注解广泛应用于自动配置类中,以决定是否应该启用某个特定的配置或 Bean。

在这里插入图片描述
所谓Spring 条件注解,就是应用程序的配置类的配置项
在这里插入图片描述

  1. @ConditionalOnClass

    • 用途:当类路径中存在某个特定类时,条件才满足。
    • 示例:如果类路径中有 EmbeddedMongo 类,则激活 MongoDB 的自动配置。
    • 代码示例
      @Configuration
      @ConditionalOnClass({ EmbeddedMongo.class })
      public class MongoAutoConfiguration {
          // 配置 MongoDB 相关的 Bean
      }
      
  2. @ConditionalOnMissingClass

    • 用途:当类路径中不存在某个特定类时,条件才满足。
    • 示例:如果类路径中没有 javax.servlet.Filter 类,则不激活与 Servlet 相关的配置。
    • 代码示例
      @Configuration
      @ConditionalOnMissingClass("javax.servlet.Filter")
      public class NonServletConfig {
          // 非 Servlet 环境下的配置
      }
      
  3. @ConditionalOnBean

    • 用途:当容器中已经存在某个特定类型的 Bean 时,条件才满足。
    • 示例:如果容器中已经有了 MyService 类型的 Bean,则激活与之相关的配置。
    • 代码示例
      @Configuration
      @ConditionalOnBean(MyService.class)
      public class MyServiceConfig {
          // 配置与 MyService 相关的其他 Bean
      }
      

使用场景

这些条件注解在 Spring Boot 的自动配置类中广泛应用,以决定是否应该激活某个特定的配置或 Bean。例如,在自动配置 MongoDB 连接时,我们可以使用 @ConditionalOnClass@ConditionalOnMissingBean 来确保只有在类路径中有 EmbeddedMongo 类且没有已存在的 Mongo Bean 时,才会创建一个新的 Mongo 实例。

总结

Spring Boot的强大之处在于其条件注解实现自动化和灵活配置。

这些注解帮助开发人员轻松构建扩展性强、配置灵活的应用而无需关注复杂配置。

通过智能地选择和配置Bean,提升了应用的健壮性和适应性。

Spring Boot自动配置依赖于一系列自动配置类,利用条件注解确定配置启用时机,并借助@EnableAutoConfiguration和SpringFactoriesLoader自动加载所需配置类。

@ConfigurationProperties简化了配置属性绑定过程。

全局配置文件如application.properties或application.yml在管理应用配置中起着关键作用,支持多环境配置确保应用在不同环境中展现不同效果。


http://www.kler.cn/news/311787.html

相关文章:

  • 【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出
  • QTAndroid编译环境配置
  • Linux基础命令——文件系统的日常管理
  • TaskRes: Task Residual for Tuning Vision-Language Models
  • vue项目中——如何用echarts实现动态水球图
  • 828华为云征文 | 华为云X实例监控与告警管理详解
  • 【Linux入门】基本指令(一)
  • 服务器上PFC配置丢失问题排查与解决方案
  • Python | Leetcode Python题解之第412题Fizz Buzz
  • 简评2024.9.16北京大运河音乐节
  • Prompt最佳实践|指定输出的长度
  • 深度学习自编码器 - 收缩自编码器(CAE)篇
  • 74、Python之函数式编程:深入理解惰性求值与生成器
  • MySql 初次见面
  • Java 基础知识九(网络编程)
  • 二叉树(下)
  • Conda Config修改
  • 深度学习-18-深入理解BERT实战使用预训练的DistilBERT模型
  • 【Vue嵌套数据中,实现动态表头和内容】
  • 不会JS逆向也能高效结合Scrapy与Selenium实现爬虫抓取
  • 前端框架对比和选择?
  • [学习笔记]树链剖分(简易版) 及其LCA
  • Redis实践之缓存:设置缓存过期策略
  • 计算机网络33——文件系统
  • sqli-labs靶场自动化利用工具——第13关
  • RabbitMQ 和 Kafka 的详细对比表格
  • 消息队列:如何确保消息不会丢失?
  • 自然语言处理实战项目全解析
  • 阻止冒泡事件
  • Python中的异步编程:从基础知识到高级应用