SpringBoot自动配置原理和自定义启动器

1、自动配置的原理

项目在加载上下文时,会根据@SpringBootApplication注解运行。该注解中有一个@CompoentScan注解,会扫描和加载当前启动类所在的目录,以及所有的子目录;还有一个是@EnableAutoConfiguration注解,这个注解会读取扫描到META-INF/spring.factories文件,这个文件里面定义了100多个自动装配依赖的配置类。 尽管能够全部读取到这些配置类,但并不会全部加载这些类以及创建类对象, 而是要根据@ConditionOnClass注解来做决定。ConditionOnClass注解会判断当前配置类对应启动器是否有添加,如果添加了启动器,就说明添加了对应的依赖,就会创建对应的配置类。

  • @CompoentScan注解,扫描文件,重点是扫描到META-INF/spring.factories文件;
  • @EnableAutoConfiguration注解,读取META-INF/spring.factories文件内容;
  • @ConditionOnClass注解, 拍板决定是否要创建META-INF/spring.factories文件里的某个配置类。

2、自定义启动器,实现自动配置

编写自动配置的自定义启动器的逻辑是,编写好默认的配置属性和配置类,以及根据配置类创建对应的对象,然后将对象交给Spring容器管理。其他人在引入启动器后,就可以直接注入核心对象使用。

(1) 项目目录结构

(2) 引入pom依赖
<dependencies><!--jedis依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!--启动器依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

(3) 创建初始化的属性值对象
package com.zhuimengren.myjedis.conf;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** jedis属性类*/
@Data
@ConfigurationProperties(prefix = "my-jedis")
public class MyJedisProperties {/*** redis的IP地址*/private String host = "localhost";/*** redis端口号*/private Integer port = 6379;/*** redis的最大连接数*/private Integer maxActive = 8;/*** redis的请求超时最大等待时间*/private Long maxWait = -1L;
}

(4) 创建默认的配置类
package com.zhuimengren.myjedis.conf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;@Configuration // 标识当前是一个配置类
@ConditionalOnClass(MyJedisProperties.class) // 判断开发的项目是否引用了启动器中的类,引用了才会执行当前配置类的代码
@EnableConfigurationProperties(MyJedisProperties.class) // 开启设置JedisProperties类读取配置文件中的数据
public class MyJedisAutoConfiguration {@Autowiredprivate MyJedisProperties myJedisProperties;private JedisPool jedisPool;public MyJedisAutoConfiguration(){JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(myJedisProperties.getMaxActive());config.setMaxWaitMillis(myJedisProperties.getMaxWait());jedisPool = new JedisPool(config,myJedisProperties.getHost(), myJedisProperties.getPort());}/*** 创建Jedis对象,加入IOC容器*/public Jedis jedis(){return jedisPool.getResource();}}

(5) 扫描配置类,交给spring容器管理

注意:如果某个类没有放在在启动类的包及其子包下,要想运行就可以将该类添加到META-INF/spring.factories文件

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zhuimengren.myjedis.conf.MyJedisAutoConfiguration

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

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

相关文章

html文件Js写输入框和弹框调接口jQuery

业务场景&#xff1a;需要使用写一个html文件&#xff0c;实现输入数字&#xff0c;保存调接口。 1、使用 JS原生写法&#xff0c; fetchAPI调接口&#xff0c;使用 alert 方法弹框会阻塞线程&#xff0c;所以写了一个弹框。 <!DOCTYPE html> <html lang"en"…

Linux文件的扩展属性 attr cap

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS…

前端性能优化 将资源放到 linux 服务器上 提升访问效率

我们先远端连接服务器 然后服务器终端输入 mkdir 目录路径建出一个新的文件路径 回到我们自己的电脑 然后 在要缓存到服务器的文件目录下打开终端 输入 scp -r ./xidis.hdr 用户名 如果没设置用户名就是root服务器公网IP:/root/xhdr例如 scp -r ./xidis.hdr root1.113.266…

链表的一些典型问题

求链表的中间节点/倒数第K个节点 等类似的随机访问&#xff0c;可以考虑用快慢指针 例 求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个…

数据之光:乡镇企业的发展利器——数据可视化

数据可视化是一项强大的工具&#xff0c;它不仅在大型企业中发挥关键作用&#xff0c;而且在乡镇企业中也能作出显著贡献。那么&#xff0c;数据可视化究竟能为乡镇企业做出什么样的贡献呢&#xff1f; 首先&#xff0c;数据可视化为乡镇企业提供了更清晰的业务洞察。通过将庞大…

Vue.js学习笔记(1)——Visual Studio Code搭建Vue.js框架

1 安装Node.js 1、下载安装包&#xff1a;进入官网&#xff08;https://nodejs.org/en&#xff09;&#xff0c;下载左侧的稳定版。 2、选择安装位置&#xff0c;不用勾选自动安装必要工具。 其他都默认Next。 配置环境&#xff0c;具体参考本文章&#xff1a; https://blo…

大语言模型(LLM)框架及微调 (Fine Tuning)

大语言模型&#xff08;LLM&#xff09; 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法&#xff0c;…

【网络安全】全网最全的渗透测试介绍(超详细)

渗透测试介绍 渗透测试就是模拟攻击者入侵系统&#xff0c;对系统进行一步步地渗透&#xff0c;发现系统地脆弱环节和隐藏风险。最后形成测试报告提供给系统所有者。系统所有者可根据该测试报告对系统进行加固&#xff0c;提升系统的安全性&#xff0c;防止真正的攻击者入侵。…

【Unity】【FBX】如何将FBX模型导入Unity

【背景】 网上能够找到不少不错的FBX模型资源&#xff0c;大大加速游戏开发时间。如何将这些FBX导入Unity呢&#xff1f; 【步骤】 打开Unity项目文件&#xff0c;进入场景。 点击Projects面板&#xff0c;右键选择Import New Assets 选中FBX文件后导入。Assets文件夹中就会…

【网络安全】upload靶场pass1-10思路

目录 Pass-1 Pass-2 Pass-3 Pass-4 Pass-5 Pass-6 Pass-7 Pass-8 Pass-9 Pass-10 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1…

求解拍频的信号特征

这张图上&#xff0c;时域已经明显产生调幅波的拍频特征。利用宏观的拍频特征可以肉眼识读两个信号的频差&#xff1a; 一秒是69.42个像素。拍频周期是&#xff1a;21.857像素。所以&#xff0c;拍频的周期是&#xff1a;3.7161Hz. 其中一个频率是50Hz&#xff0c;另一个频率…

C# Winform教程(二):基础窗口程序

1、介绍 winform应用程序是一种智能客户端技术&#xff0c;我们可以使用winform应用程序帮助我们获得信息或者传输信息等。 2、常用属性 Name&#xff1a;在后台要获得前台的控件对象&#xff0c;需要使用Name属性。 Visible&#xff1a;指示一个控件是否可见、 Enable&…

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果 0. 背景1. 验证环境说明2. 验证开始2-1. 准备测试数据库2-2. 读取环境配置信息2-3. 导入依赖包2-3. 创建 SQLDatabaseToolkit 对象和 AgentExecutor 对象2-4. 第1个测试 - 描述一个表2-5. 第2个测…

算法训练第五十三天|1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列&#xff1a; 题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对…

手机怎么下载python并安装,如何在手机上下载python

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何在手机上下载python 3.7版本&#xff0c;手机怎么下载python并安装&#xff0c;现在让我们一起来看看吧&#xff01; 如何在手机上下载python 应用市场内搜索下载下载Python在您开始之前&#xff0c;在你的计算机将…

【leetcode100-025】【链表/快慢指针】环形链表

【题干】 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

软件测试/测试开发丨Python 虚拟环境及pip环境管理

venv 虚拟环境管理 venv 虚拟环境的优点 独立的 Python 环境&#xff0c;不会产生冲突有助于包的管理删除和卸载方便 venv 使用方法 创建虚拟环境 python3 -m venv test 激活虚拟环境 切换指定文件夹Windows&#xff1a;/Scripts/macOS&#xff1a;/bin/ 执行指令&#xff…

欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

智能合约概述 智能合约是运行在区块链网络中的一段程序&#xff0c;经由多方机构自动执行预先设定的逻辑&#xff0c;程序执行后&#xff0c;网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本&#xff0c;由去中心化的计算机网络执行&#xff0c;而不是由政府…

MIT 6.S081---Lab util: Unix utilities

环境搭建 基本环境 选择的是Vmwareubuntu的配置&#xff0c;注意ubuntu的版本一定要是20.04&#xff0c;作者试过16版本&#xff0c;不行&#xff0c;建议直接安装20.04版&#xff0c;不然环境配置都浪费不少时间有点得不偿失。&#xff08;Vmware可以用Virtualbox代替&#…