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

SpringBoot基础详解

目录

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 {@Beanpublic 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 {@Autowiredprivate UserManager userManager;
    ​@GetMapping("/user")public String sayHello(){return userManager.sayHello();}
    }

    浏览器结果:

相关文章:

SpringBoot基础详解

目录 SpringBoot自动配置 基于条件的自动配置 调整自动配置的顺序 纷杂的SpringBoot Starter 手写简单spring-boot-starter示例 SpringBoot自动配置 用一句话说自动配置&#xff1a;EnableAutoConfiguration借助SpringFactoriesLoader将标准了Configuration的JavaConfig类…...

学会Docker之---应用场景和基本操作

实体机、VM和容器 实体机&#xff08;Physical Machine&#xff09;是指实际的物理设备&#xff0c;例如我们常见的计算机主机、服务器等。它们是由硬件组成&#xff0c;可以直接运行操作系统和应用程序。 虚拟机&#xff08;Virtual Machine&#xff09;是在一台物理机上通过…...

C++_linux下_非阻塞键盘控制_程序暂停和继续

1. 功能 在程序执行过程中,点击键盘p按键(pause), 程序暂停, 点击键盘上的n按键(next),程序继续执行 2. 代码 #include <iostream> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/ioctl.h> char get_keyboar…...

SQL AND, OR and NOT(与,或不是运算符)

SQL AND & OR 运算符 AND&OR运算符用于根据一个以上的条件过滤记录&#xff0c;即用于组合多个条件以缩小SQL语句中的数据。 WHERE子句可以与AND&#xff0c;OR和NOT运算符结合使用。 AND和OR运算符用于根据多个条件筛选记录&#xff1a; 如果由AND分隔的所有条件为TR…...

Python网络编程之Socket(套接字)

文章目录 一、Socket概念二、套接字的发展史及分类三、Socket的使用语法格式(基于TCP协议)1.基于TCP协议的套接字(socket)编程半连接池 2.基于UDP协议的套接字(socket)编程也可以使用服务端只接收客户端消息 黏包现象 一、Socket概念 Socket套接字&#xff0c;一种独立于协议的…...

金山终端安全系统V9.0 SQL注入漏洞复现

0x01 产品简介 金山终端安全系统是一款为企业提供终端防护的安全产品&#xff0c;针对恶意软件、病毒和外部攻击提供防范措施&#xff0c;帮助维护企业数据和网络。 0x02 漏洞概述 金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞&#xff0c;该…...

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP&#xff08;One-Time Password&#xff09;是一种用于身份验证的协议&#xff0c;它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录&#xff0c;以下是一些实现步骤&#xff1a; 1、安装Radius服务器 首先需要安装Radius服务器…...

ROS opencv 人脸识别

人脸识别需要在输入的图像中确定人脸&#xff08;如果存在&#xff09;的位置、大小和姿态&#xff0c;往往用于生物特征识别、视频监听、人机交互等应用中。2001年&#xff0c;Viola和Jones提出了基于Haar特征的级联分类器对象检测算法&#xff0c;并在2002年由Lienhart和Mayd…...

文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告

本心、输入输出、结果 文章目录 文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告前言相关跳转文心一言 4.0 ERNIE-Bot 4.0 接口简介Bash 请求示例代码Windows 模式使用 Python 请求如果直接使用官方提供的代码文心一言 4.0 ERNIE-Bot 4.0 API 在…...

华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子&…...

请求转发和重定向区别

两者区别&#xff1a; 1.转发在一次请求中完成&#xff0c;重定向是两次请求 2.转发操作发生在服务器内部&#xff0c;重定向是在浏览器执行操作 3.转发地址栏不变&#xff0c;重定向地址栏变化&#xff08;两次请求&#xff0c;两个地址&#xff09; 4.转发可以在一次请求中共…...

JS如何判断对象为空?以及各自的缺点。

JS如何判断对象为空&#xff1f;以及各自的缺点。 Object.keys() 通过 Object.keys() 来获取对象的键进行判断。 function isEmpty(obj) {return Object.keys(obj).length 0; }console.log(isEmpty({})); // true console.log(isEmpty({ a: 1 })); // false缺点&#xff1a…...

同城代驾开源版小程序开发

同城代驾开源版小程序开发 功能特性描述&#xff1a; 定价模式&#xff1a;本系统支持灵活的计价模式&#xff0c;包括白天和夜晚的起步价、起步里程、每公里价以及超时费用&#xff0c;从而满足不同时段的定价需求。 实时路径计算&#xff1a;通过集成腾讯地图的软件开发工…...

【Python机器学习】零基础掌握ShrunkCovariance协方差估计

有没有想过如何准确地评估股票投资的风险? 在投资领域,了解各种资产(如股票、债券等)之间的相关性和波动性是非常重要的。常用的方法是计算资产收益率的协方差矩阵,但这个矩阵在样本量少或数据质量不高的情况下可能会产生误导。那么,有没有更好的方法来解决这个问题呢?…...

精神科常用评估量表汇总,建议收藏!

根据精神科医生的量表使用情况&#xff0c;笔者整理了10个精神科常用量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 抑郁自评量表 抑郁自评量表…...

Python之切片

Python之切片 切片 通过给定的索引区间获得线性结构的一部分数据start、stop、step为整数&#xff0c;可以是正整数、负整数、零start为0时&#xff0c;可以省略stop为末尾时&#xff0c;可以省略step为1时&#xff0c;可以省略切片时&#xff0c;索引超过上界(右边界)&#…...

OpenCV显示中文(python)

OpenCV添加文字的方法putText(…)&#xff0c;添加英文是没有问题的&#xff0c;但如果你要添加中文就会出现“&#xff1f;&#xff1f;&#xff1f;”的乱码&#xff0c;需要特殊处理一下。 下文提供封装好的&#xff08;代码&#xff09;方法&#xff0c;供OpenCV添加中文使…...

k8s-18 认证授权

Authentication (认证) 认证方式现共有8种&#xff0c;可以启用一种或多种认证方式&#xff0c;只要有一种认证方式通过&#xff0c;就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式 Kubernetes集群有两类用户:由Kubernetes管理的Ser…...

WebAPI+EF连接SQL Server数据库

右击解决方案-添加-新建项目-选择“类库&#xff08;.NET Framework&#xff09;”,新建的项目取名叫WebApi1.EF 添加EF&#xff1a; 新建一个ADO实体数据模型 选择DBFirst 数据源选择MySql 填写数据库地址及账号密码 选择实体框架版本 选择在数据库中的表User 到此配置完成&am…...

maven-plugin-shade 详解1

maven-plugin-shade 是 Maven 的一个插件&#xff0c;它的作用是将多个 jar 包合并成一个 jar&#xff0c;同时将其中的依赖关系也合并到该 jar 中。这个插件常用于创建可执行 jar 包和打包 web 应用程序。 下面是 maven-plugin-shade 的一些常用配置&#xff1a; 打包的形式&…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中&#xff0c;点击确定 这是最终结果&#xff0c;但是由于环境启不了&#xff0c;这里用的是自己的excel&#xff0c;真实的环境中的excel根据实训…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...