SpringBoot基础详解

news2025/3/15 11:31:52

目录

SpringBoot自动配置

基于条件的自动配置

调整自动配置的顺序

纷杂的SpringBoot Starter

手写简单spring-boot-starter示例



SpringBoot自动配置

用一句话说自动配置:@EnableAutoConfiguration借助SpringFactoriesLoader将标准了@Configuration的JavaConfig类汇总加载到ApplicationContext。

基于条件的自动配置

在自动配置的基础上,我们可以通过@Conditional配合@Configuration或者@Bean来干预配置或者bean定义是否能够生效,类似于下面伪代码的效果:

if(符合@Conditional规定的条件) {
    加载当前配置或者注册当前bean的定义;
}

常见的 @Conditional 注解及其作用:

  1. @ConditionalOnClass:当指定的类位于类路径上时,才加载配置的 Bean。这可用于在依赖库存在时加载 Bean。

    @Configuration
    @ConditionalOnClass(MyLibraryClass.class)
    public class MyConfiguration {
        // 配置 Bean
    }
  2. @ConditionalOnMissingClass:与 @ConditionalOnClass 相反,当指定的类不存在于类路径上时,才加载配置的 Bean。

    @Configuration
    @ConditionalOnMissingClass("com.example.SomeClass")
    public class MyConfiguration {
        // 配置 Bean
    }
  3. @ConditionalOnProperty:根据指定的配置属性是否存在,来加载 Bean。可用于在应用程序的属性文件中控制 Bean 的加载。

    @Configuration
    @ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
    public class MyConfiguration {
        // 配置 Bean
    }
  4. @ConditionalOnExpression:基于 SpEL 表达式的计算结果来加载 Bean。

    @Configuration
    @ConditionalOnExpression("${myapp.feature.enabled}")
    public class MyConfiguration {
        // 配置 Bean
    }
  5. @ConditionalOnWebApplication:当应用程序运行在 Web 环境下(例如,Spring MVC 或 Spring Boot)时,加载配置的 Bean。

    @Configuration
    @ConditionalOnWebApplication
    public class MyWebConfiguration {
        // 配置 Web 相关 Bean
    }
  6. @ConditionalOnJava:当运行应用程序的 Java 版本满足指定条件时,加载 Bean。

    @Configuration
    @ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
    public class MyJava8Configuration {
        // 配置 Java 8 相关 Bean
    }
调整自动配置的顺序

@AutoConfigureBefore和@AutoConfigureAfter是 Spring Boot 自动配置中的注解,它们用于控制自动配置类的加载顺序。这些注解允许我们明确指定自动配置类的加载顺序,以确保在加载自动配置类时符合特定的依赖关系。

以下是它们的作用和用法:

  1. @AutoConfigureBefore

    • @AutoConfigureBefore 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之前先加载指定的自动配置类。

    • 这可以用于确保在当前自动配置类之前配置某些依赖,以满足特定的应用程序需求。

    • 示例:

      @Configuration
      @AutoConfigureBefore(AnotherAutoConfiguration.class)
      public class MyAutoConfiguration {
          // 配置 Bean
      }
  2. @AutoConfigureAfter

    • @AutoConfigureAfter 注解用于指定一个或多个自动配置类,它告诉 Spring Boot 在加载当前自动配置类之后加载指定的自动配置类。

    • 这可以用于确保在当前自动配置类之后配置某些依赖,以满足特定的应用程序需求。

    • 示例:

      @Configuration
      @AutoConfigureAfter(AnotherAutoConfiguration.class)
      public class MyAutoConfiguration {
          // 配置 Bean
      }

纷杂的SpringBoot Starter

Spring Boot Starters 是一组官方维护的依赖关系,用于简化 Spring Boot 应用程序的配置和引导。它们旨在为特定类型的应用程序或用例提供一组默认的依赖项,以减少配置工作和提高开发效率。以下是一些常见的 Spring Boot Starters:

  1. spring-boot-starter-web:用于构建 Web 应用程序的 Starter,包括 Spring MVC、嵌入式 Servlet 容器(如Tomcat或Jetty)以及其他与 Web 相关的依赖项。适用于开发 RESTful Web 服务和传统的 Web 应用程序。

  2. spring-boot-starter-data-jpa:用于访问关系型数据库的 Starter,包括 Spring Data JPA、Hibernate 和数据源配置。适用于构建基于 JPA 的数据访问层。

  3. spring-boot-starter-data-mongodb:用于访问 MongoDB 的 Starter,包括 Spring Data MongoDB 和 MongoDB 驱动。适用于构建使用 MongoDB 的应用程序。

  4. spring-boot-starter-data-redis:用于访问 Redis 的 Starter,包括 Spring Data Redis 和 Redis 客户端。适用于构建使用 Redis 的应用程序。

  5. spring-boot-starter-data-solr:用于访问 Apache Solr 的 Starter,包括 Spring Data Solr 和 Solr 客户端。适用于构建使用 Solr 的搜索应用程序。

  6. spring-boot-starter-data-elasticsearch:用于访问 Elasticsearch 的 Starter,包括 Spring Data Elasticsearch 和 Elasticsearch 客户端。适用于构建使用 Elasticsearch 的搜索应用程序。

  7. spring-boot-starter-security:用于添加 Spring Security 支持的 Starter,包括身份验证和授权功能。适用于构建安全的应用程序。

  8. spring-boot-starter-test:用于测试 Spring Boot 应用程序的 Starter,包括JUnit、Spring Test、Mockito 和其他测试框架。适用于单元测试和集成测试。

  9. spring-boot-starter-actuator:用于添加 Spring Boot Actuator 支持的 Starter,包括监控和管理功能,如健康检查、度量、追踪等。

  10. spring-boot-starter-logging:用于日志记录的 Starter,包括 Logback、Log4j2 和其他日志框架。适用于配置应用程序的日志输出。

  11. spring-boot-starter-parent:这是一个父项目 Starter,它用于管理 Spring Boot 应用程序的依赖版本,通常作为 Spring Boot 项目的父项目引用。

  12. spring-boot-starter-xxx:除上述常见的 Starter 外,还有许多其他官方和社区维护的 Starter,如消息队列(如Kafka、RabbitMQ)、NoSQL 数据库(如Cassandra、Couchbase)等。

手写简单spring-boot-starter示例

在了解自动配置的原理后,就简单地创建一个自定义的spring-boot-starter吧。

文件目录贴一下:

  1. 创建自动配置类和需要定义的bean。

    @Configuration
    public class MyUserAutoConfiguration {
        @Bean
        public UserManager userManager(){
            return new UserManager();
        }
    }
    public class UserManager {
        public String sayHello() {
            return "own-starter:hello.";
        }
    }
  2. src/main/resources/META-INF/ 目录下创建一个 spring.factories 文件

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.lloyd.user.MyUserAutoConfiguration
  3. 创建一个spring-web的SpringBoot项目,添加自定义Starter的依赖。

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 自定义starter的坐标 -->
            <dependency>
                <groupId>com.lloyd</groupId>
                <artifactId>springboot_06_own_starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  4. 创建一个Rest接口进行验证

    @RestController
    public class UserController {
        @Autowired
        private UserManager userManager;
    ​
        @GetMapping("/user")
        public String sayHello(){
            return userManager.sayHello();
        }
    }

    浏览器结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RPC 接口测试技术 —— websocket 自动化测试实践!

WebSocket 是一种在单个 TCP 连接上进行全双工通信 (Full Duplex 是通讯传输的一个术语。通信允许数据在两个方向上同时传输&#xff0c;它在能力上相当于两个单工通信方式的结合。全双工指可以同时&#xff08;瞬时&#xff09;进行信号的双向传输&#xff08; A→B 且 B→A &…

Spring()

一、导学 二、 1.入门程序 spring快照版本是最新的版本&#xff0c;未发布。需要用到<repository></> 下面这个不需要配置仓库&#xff0c;直接写在依赖中就行 引入spring相关依赖 <?xml version"1.0" encoding"UTF-8"?> <proje…

QT实现凸凹边形等距缩放

参考&#xff1a;https://blog.csdn.net/weixin_39383896/article/details/99615371和https://blog.csdn.net/qq_15821883/article/details/117421400 代码逻辑思路&#xff1a; 1、获取向量AB、BC的坐标。 2、计算向量AB、BC的长度。 3、根据点乘获取cosθ大小。 4、根据cosθ…

LeetCode 高频题目分类列表

&#x1f4a1; LeetCode 高频面试题分类列表&#xff0c;总共24类&#xff0c;312道题目&#xff01; 图 133.克隆图 207.课程表 210.课程表 II 399.除法求值 547.省份数量 684.冗余连接 743.网络延迟时间 785.判断二分图 堆 215.数组中的第K个最大元素 295.数据流的中位数 26…

【性能测试篇1】初识性能测试

目录 性能测试定义 性能测试和功能测试有什么区别 测试工具上面&#xff1a; 特殊业务场景下&#xff1a; 性能测试常见概念&#xff1a; ①用户相关&#xff1a; 1.1并发用户数&#xff1a; 1.2在线用户数&#xff1a; 1.3系统用户数量&#xff1a; ②响应时间相关&…

Golang操作数据库简单示例

目录 准备工作准备数据创建项目连接数据库查询数据修改数据插入数据删除数据释放资源完整代码最终执行结果 准备工作 在开始之前&#xff0c;你需要确保自己安装了Golang的编程环境&#xff0c;安装MySQL数据库&#xff0c;有一个可以用于编写代码的编辑器或IDE工具。我在这里…

大型公共建筑能耗监测与信息管理系统研究及产品选型

摘要&#xff1a;文章通过阐述大型公共建筑能耗现状&#xff0c;突出大型公共建筑实施节能监管的必要性&#xff0c;并在系统总结运用技术手段实施建筑能耗监测的基础上&#xff0c;介绍了江苏省建筑能耗监测系统研究过程中的技术创新和应用情况。 关键词&#xff1a;公共建筑…

深度学习——含并行连接的网络(GoogLeNet)

深度学习——含并行连接的网络&#xff08;GoogLeNet&#xff09; 文章目录 前言一、Inception块二、GoogLeNet模型三、训练模型总结 前言 上篇文章中学习了NIN&#xff0c;而GoogLeNet吸收了NIN中串联网络的思想&#xff0c;并在此基础上做了改进。该论文中的一个观点是&…

PyQt5基础学习(一)

从PyQt5最基础的内容开始学习 import sysfrom PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QApplication, QTextBrowserclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(300, 300)self.setWind…

数据结构之单链表的模拟实现

&#x1f495;"你笑的次数越多越好&#xff0c;因为你只有用笑才能不怀恶意地消灭罪恶。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之单链表的模拟实现 MyArrayList /*** Created with IntelliJ IDEA.* Description:* User: 绿字* …

F5.5G落进现实:目标网带来的光之路

数字化与智能化的世界将走向何方&#xff1f;这个问题有着非常复杂的答案&#xff0c;但其中有一个答案已经十分清晰。那就是智能化的下一步&#xff0c;必将走向泛在万兆的世界。 网络是算力联接的底座&#xff0c;是智能演化的基础。纵观每一代数字化升级&#xff0c;都可以发…

2023秋招华为技术岗线上面试经历

2023/10/16 个人情况&#xff1a;博士&#xff0c;预计2024年毕业&#xff0c;参加了2023秋招&#xff0c;华为应聘到3面主管面。 下面按招聘流程顺序&#xff0c;记录我的面试经历。因为想写详细一点的独立文章&#xff0c;所以想来想去还是放到CSDN上。 1. 宣讲会 宣讲会…

kr 第三阶段(一)16 位汇编

为什么要学习 16 位汇编&#xff1f; 16 位汇编包含了大部分 32 位汇编的知识点。有助于在学习内核的两种模式。 实模式&#xff1a;访问真实的物理内存保护模式&#xff1a;访问虚拟内存 有助于提升调试能力&#xff0c;调试命令与 OllyDbg 和 WinDebug 通用。可以学习实现反…

spring boot整合MongoDB 一

MongoDB介绍 应用场景 传统的关系型数据库&#xff08;如MySQL&#xff09;&#xff0c;在数据操作的“三高”需求以及应对Web2.0的网站需求面前&#xff0c;显得力不从心。 解释&#xff1a;“三高”需求&#xff1a; • High performance - 对数据库高并发读写的需求。 • …

制作.a静态库 (封盒)

//云库房间 1.GitHub上创建开源框架项目须包含文件&#xff1a; LICENSE:开源许可证&#xff1b;README.md:仓库说明文件&#xff1b;开源项目&#xff1b;(登录GitHub官网) 2. 云仓储库构建成功(此时云库中没有内容三方框架)&#xff01;&#xff01;&#xff01; 3. 4.5. //…

数仓建设(二)

1) 指标梳理 指标口径的不一致使得数据使用的成本极高&#xff0c;经常出现口径打架、反复核对数据的问题。在数据治理中&#xff0c;我们将需求梳理到的所有指标进行进一步梳理&#xff0c;明确其口径&#xff0c;如果存在两个指标名称相同&#xff0c;但口径不一致&#xff0…

项目管理之生命周期管理

项目生命周期管理矩阵是项目管理中一个重要的概念&#xff0c;它包括了项目从准备到收尾的各个阶段。项目生命周期管理矩阵以四个主要管理阶段为基础&#xff0c;分别为准备阶段、启动阶段、执行阶段和收尾阶段。这四个阶段在项目管理中有着明确的目标和职责&#xff0c;贯穿了…

【LeetCode】35. 搜索插入位置

1 问题 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例…

GPT4 Plugins 插件 WebPilot 生成抖音文案

1. 生成抖音文案 1.1. 准备1篇优秀的抖音文案范例 1.2. Promept公式 你是一个有1000万粉丝的抖音主播&#xff0c; 请模仿下面的抖音脚本文案&#xff0c;重新改与一篇文章改写成2分钟的抖音视频脚本&#xff0c; 要求前一部分是十分有争议性的内容&#xff0c;并且能够引发…

linux进程间通讯--信号量

1.认识信号量 方便理解&#xff1a;信号量就是一个计数器。当它大于0能用&#xff0c;小于等于0&#xff0c;用不了&#xff0c;这个值自己给。 2.特点&#xff1a; 信号量用于进程间同步&#xff0c;若要在进程间传递数据需要结合共享内存。信号量基于操作系统的 PV 操作&am…