带你深入了解 SpringBoot 自动配置原理及自定义Starter

gogs上传大文件报错error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 gogs上传大文件报错error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 阅读详情

1.SpringBoot自动配置原理

从@SpringBootApplication注解开始说,这个注解是一个复合注解,他是由以下几个注解构成的。

// 用于讲其他配置类,注入到spring ioc中的
@SpringBootConfiguration
// 自动配置最重要的注解
@EnableAutoConfiguration
// 用于扫描其他注解(@service、@controller)等等
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

记得点赞收藏加关注哦 ,需要下载PDF版本和获取更多知识点、面试题的朋友可以点一点下方链接免费领取

链接:点这里!!! 580763979 暗号:优快云

在这里插入图片描述

接下来从@EnableAutoConfiguration开始讲起

其中关键的地方就是这个AutoConfigurationImportSelector类
@Import({AutoConfigurationImportSelector.class})

他里面的selectImports方法中getAutoConfigurationEntry就是获取自动配置的重要组成

public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
    return NO_IMPORTS;
} else {
    AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
    return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
    return EMPTY_ENTRY;
} else {
    AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
    List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    configurations = this.removeDuplicates(configurations);
    Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
    this.checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = this.getConfigurationClassFilter().filter(configurations);
    this.fireAutoConfigurationImportEvents(configurations, exclusions);
    return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}

通过上述获取在META-INF/spring.factories,

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}

在spring.factories中会存在很多这样的键值对

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

当springboot启动的时候就会加载这些xxxAutoConfigureation,这里以RedisAutoConfiguration为例,介绍是如何进行配置的。

// 只有符合这种要求的,才会将xxxAutoConfigureation加载到spring中
@ConditionalOnClass({RedisOperations.class})
// 开启配置类
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {

RedisProperties配置类,看到这个类,是不是很熟悉,他就是我们在yml里面配置的东西

@ConfigurationProperties(
    prefix = "spring.redis"
)
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String username;
    private String password;
    private int port = 6379;
    private boolean ssl;
    private Duration timeout;
    private Duration connectTimeout;
    private String clientName;
}

总结:通过上述流程实现将快速配置,减少了繁琐的xml配置,如果要配置,只需简单的在yml配置即可。

2.自定义starter,简单实现一个线程池的创建

创建一个thread-pool-execute-starter的工程

// 添加依赖
<groupId>com.angel.item</groupId>
<artifactId>thread-pool-execute-starter</artifactId>
<version>1.0</version>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

自动配置类

@Configuration
// 配置配置属性
@EnableConfigurationProperties(ThreadPoolExecutorProperties.class)
// 只有这个类才会生校
@ConditionalOnClass(ThreadPoolExecutor.class)
public class ThreadPoolAutoConfiguration {

    /**
     * 阻塞队列
     */
    private final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(4);
    /**
     * 拒绝策略
     */
    private final RejectedExecutionHandler reject = new ThreadPoolExecutor.AbortPolicy();
    /**
     * 线程池类型:CPU密集型:1;IO密集型:2
     */
    @Value("${scenes}")
    private Integer scenes;
    /**
     * 核心线程数大小
     */
    private Integer corePoolSize;
    /**
     * 最大线程数大小
     */
    private Integer maximumPoolSize;
    /**
     * 空闲线程存活时长
     */
    private Long keepAliveTime;
    /**
     * 存活时长单位
     */
    private TimeUnit unit;

    @PostConstruct
    public void init() {
        // 获取系统CPU核心数
        int cpuCoreNumber = Runtime.getRuntime().availableProcessors();
        this.corePoolSize = cpuCoreNumber;
        this.maximumPoolSize = 25 * cpuCoreNumber;
        this.keepAliveTime = 60 * 3L;
        this.unit = TimeUnit.SECONDS;
    }

    /**
     * N: CPU核心数
     * CPU密集型:corePoolSize = N + 1
     * IO密集型:corePoolSize = 2 * N
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // cpu密集型
        if (scenes == 1) {
            corePoolSize = corePoolSize + 1;
        } else {
            // io密集型
            corePoolSize = 2 * corePoolSize;
        }
        return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, reject);
    }
}

配置类属性

@ConfigurationProperties(
        prefix = "thread.pool"
)
public class ThreadPoolExecutorProperties {

    private Integer scenes = 1;

    public Integer getScenes() {
        return scenes;
    }

    public void setScenes(Integer scenes) {
        this.scenes = scenes;
    }
}

在resources中新建META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.angel.item.ThreadPoolAutoConfiguration

将工程重新打包,mvn clean install -U

在另外的工程中引入上面的坐标

<dependency>
    <groupId>com.angel.item</groupId>
    <artifactId>thread-pool-execute-starter</artifactId>
    <version>1.0</version>
</dependency>

在yml配置即可

thread:
  pool:
    scenes: 1

mvn package 重新打包

总结:通过上述配置自定义starter就可以实现了

总结

我这里也准备了一线大厂面试资料和超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作!

有需要的朋友可以点一点下方链接免费领取

链接:点这里!!! 580763979 暗号:优快云

在这里插入图片描述
在这里插入图片描述

SpringBoot中自定义Starter 1. 前置知识1-1 什么是Starter?1-2 常用的Condition注解说明1-3 Starter的命名规范2. 自定义自己的Starter示例2-1 创建Starter项目2-2 Pom.Xml【示例引入了spring-boot-starter和lombok】2-3-1 配置类:PersonProperties2-3-2 业务类:PersonService2-3-3 自动配置类:PersonAutoConfiguration2-4 创建spring.factories文件。 阅读详情

相关推荐

git -- RPC failed; HTTP 403 curl 22 The requested URL returned error: 403

错误: RPC failed; HTTP 403 curl 22 The requested URL returned error: 403 原因: 账户没有读写权限,联系管理索要权限 排查方法: 使用账户登录git地址,找到当前项目 示例1: 示例2:

King Saj 4680

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 解决方案

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 解决方案 使用Git提交时报错,代码如下: $ git push -u origin "master" Counting objects: 100% (95/95), done. Delta compression using up to 12 threads Compressing objects: 100% (92/92), done. Writing ob

weixin_53166575的博客 1万+

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

是SpringBoot的一个重要概念,是“一站式服务 (one-stop)”的依赖 Jar 包包含 Spring 以及相关技术(比如 Redis)的所有依赖提供了自动配置的功能,开箱即用提供了良好的依赖管理,避免了包遗漏、版本冲突等问题。简单来说, Springboot starter 提供了一种自动配置的机制,我们只需要将需要的Starter引入项目中,它就会自动为我们配置相关的依赖和配置。这使得开发人员可以更加关注业务逻辑的实现;现在我们来学习一下它的原理,以便后面能更清晰地实现。这个技能对你有用么。

狮子也疯狂的博客 4358

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413解决方案

总的来说,HTTP 413错误是服务器告诉你,你正在尝试发送的数据太大,无法处理。解决这个问题通常需要减小你正在发送的数据,或者增大服务器可以接受的数据大小。在Git的上下文中,可能涉及到更改Git的配置,或者更改使用的传输协议。请注意,这不是解决所有问题的银弹,如果服务器端的限制低于你在客户端设置的值,你仍然会遇到HTTP 413错误。对于Git,如果你正在使用HTTP/HTTPS进行推送,你可能需要调整一些Git的配置。的大小是1MB,如果你正在推送大量的数据,可能需要增大这个值。

高性价比服务器就选:蓝易云 4976

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

git首次提交代码到远程仓库提示413错误,错误信息如下 git push --set-upstream origin master Enumerating objects: 153, done. Counting objects: 100% (153/153), done. Delta compression using up to 4 threads Compressing objects: 100% (133/133), done. error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Req

Python Selenium自动化浏览器实战:从环境搭建到高级技巧

浏览器自动化是现代软件开发与数据处理中的关键技术,它通过程序模拟用户操作,实现网页交互的自动化执行。其核心原理是基于WebDriver协议,通过驱动程序与浏览器进行通信,从而控制浏览器的各种行为。这项技术的价值在于能够将重复性高、耗时长的Web操作转化为可编程、可复用的脚本,极大提升工作效率和准确性。在应用场景上,它广泛覆盖了Web自动化测试、数据采集与爬虫、日常办公流程自动化以及RPA(机器人流程自动化)等多个领域。本文聚焦于Python环境下Selenium这一经典工具,深入讲解其环境配置、八大元素定位

anwenzhao0749的博客 447

了解SpringBoot自动配置原理开发自己的Starter

了解SpringBoot自动配置原理开发自己的Starter前言从启动到装配@EnableAutoConfiguration 注解验证分析实践大于理论SpringBoot starter机制自定义starter好处构建DEMO Starter测试结语 前言 公司使用SpringBoot开发已经有些时日了,也写了不少公司内部的starter(公司业务处理核心模块),今天就和大家聊聊SpringBo...

Micro麦可乐的博客 1万+

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

本文主要介绍了如何在摩尔线程 MTT S80 上通过 Ollama 快速完成DeepSeek R1 蒸馏系列模型的推理。

摩尔线程blog中心 3602

SpringBoot-starter的原理

目录 一、前言 1.1 SpringBoot的优点 1.2 SpringBoot-starter的作用 二、SpringBoot-starter解析 2.1 SpringBoot搭建SSM 2.2 SpringBoot的诸多配置 2.3 SpringBoot-starter自动配置bean 一、前言 1.1 SpringBoot的优点 SpringBoot是新一代流行的Spri...

天天向上 2万+

python k线顶分型_【缠论】分型、笔的定义及其程序化

K线包含关系处理和分型的定义如果一个K线的高低点全在另一K线的范围里,称之为包含关系。针对这种K线,需要进行一些处理,去除包含关系,处理方法:向上时,把两K线的高点当高点,而两K线低点中的较高者当成低点;反之,当向下时,把两K线的低点当低点,而两K线高点中的较低者当成高点,这样就把两K线合并成一新的K线。经过这样的处理,所有K线图都可以处理成没有包含关系的图形。两K线的包含关系,可以分成四种:1)...

weixin_39717152的博客 2826

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4479

SpringBoot自动配置原理

Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。通俗的来讲,我们之前在写ssm项目时候,配置了大量坐标和配置内容,搭环境的过程在项目开发中占据了大量时间,Spring Boot的最大的特点就是简化了各种xml配置内容,所以springboot的自动配置。...

m0_46420244的博客 2万+

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 560

springboot starter工作原理_详解SpringBoot——启动原理及自定义starter

来源:https://segmentfault.com/a/1190000019038272?utm_source=tag-newestSpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置。在日常开发中,我们也会自定义一些Starter,特别是现在微服务框架,我们一个项目分成了多...

weixin_39565910的博客 1万+

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2467

Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南

Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南

丨汀、的博客 2651

带你手写starter组件,搞懂SpringBoot自动配置原理

至此,我们就实现了手写SpringBoot项目中的starter组件,进而实现了自动配置。其实从仿照druid的Datasource类中就可以发现,SpringBoot的核心机制就是可以自动配置,通过大量的自动配置,大量的bean被自动配置到容器中,这就大大简化了过去手动配置bean的过程,从而简化整个项目的开发过程,这也就是SpringBoot的最大优势所在!现在你知道SpringBoot是怎么实现自动配置的了吗?如果你还有什么疑问,可以在评论区给壹哥留言,或者关注下面的【Java架构栈https。...

一一哥 1250

Python爬虫实战:使用最新技术爬取新华网新闻数据

在当今信息爆炸的时代,网络爬虫技术已经成为获取互联网数据的重要手段。作为国内权威新闻媒体,新华网每天发布大量高质量的新闻内容,这些数据对于舆情分析、市场研究、自然语言处理等领域具有重要价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的新华网新闻爬虫系统。本文详细介绍了如何使用Python最新技术栈构建一个高效、稳定的新华网新闻爬虫系统。我们从基础爬虫开始,逐步添加了代理支持、用户代理轮换、请求延迟、重试机制、动态页面渲染、数据存储等高级功能,最终实现了一个生产可用的分布式爬虫系统。

2201_76125261的博客 1771

springboot 自动配置原理

springboot 自动配置原理、EnableAutoConfiguration、Configuration、ComponentScan、DeferredImportSelector、ImportSelector

杨宇昌的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

springboot自动配置自定义的Starter

springboot自动配置自定义的Starter 文章目录springboot自动配置自定义的Starter1.自动配置原理2.自定义Starter 代码示例下载:https://github.com/2010yhh/springBoot-demos/tree/master/springboot-user-starter 1.自动配置原理 @SpringBootApplication @Ena...

2010yhh 1658

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【SpringBoot】之创建自定义 SpringBoot-Starter

本文介绍了 SpringBoot Starter 的相关内容,同时详细讲解了如何创建一个自定义的 SpringBoot Starter。

王廷云的博客 3327

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

springboot自定义Starter

在我们学习SpringBoot时都已经了解到starter是SpringBoot的核心组成部分,SpringBoot为我们提供了尽可能完善的封装,提供了一系列的自动化配置的starter插件,我们在使用spring-boot-starter-web时只需要在pom.xml配置文件内添加依赖就可以了,我们之前传统方式则是需要添加很多相关SpringMVC配置文件。而spring-boot-start...

沐宇熙IT成长之路 2万+

Springboot基础之——自定义starter

通过这篇文章,你将了解到springboot自动装配原理,以及如何自定义starter。

qq_63003916的博客 3529

【SpringBoot】自定义Starter

本篇详细介绍了如何自定义一个Starter并导入到其他项目进行使用,已经一些相关注意事项

观止study 4611

SpringBoot场景启动器(starter)原理及实践

文章目录一、SpringBoot的starter简介1.1 什么是starter(场景启动器)二、SpringBoot场景启动器的原理2.1 自动配置原理2.1.1 自动配置类的获取与注入2.1.2 自动配置的过程2.2 SpringBoot自动配置使用总结三、自定义场景启动器3.1 starter的命名规范3.2 starter模块整体结构3.3 autoconfigure模块开发3.3.1 依赖引入3.3.2 xxxAutoConfiguration的实现3.3.3 xxxProperties的实现3.

星的博客 5334

一文搞懂 springboot 自动配置原理

springboot 自动配置原理,手写 starter 和 自动配置类

zwl2220943286的博客 2187
上一篇: SpringBoot 定时任务(schedule、quartz) 分析
XingXing_Java
博客等级 码龄7年 278粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值