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

springboot自动装配原理,手写一个starter。

文章目录

  • springboot自动装配原理
  • 手写starter
  • 手写starter总结:

springboot自动装配原理

口述:

  1. springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖,它就能完成这个依赖组件相关Bean的自动注入,其实就是自动的将我们所需要的Bean装配到IoC容器中,比如说我们用redis的话,我们只需要将redis的一个data-redis的starter起步依赖引入,并且在配置文件中去指出ip端口,那我们在程序中就可以用autowired注入redisTemplate,就可以用了,其实这个redisTemplate就已经存在在IOC容器中了,我们用直接取就可以了,其实这个就是自动装配了我们redis所需要的bean了。
  2. 它其实是因为我们在启动类上面的springbootapplication注解里面,包含着@enableautoconfiguration注解,它表示我们开启了自动装配,其实在这个@enableautoconfiguration注解里面有@import这个注解,@import的话我们常用的就是将配置类传入进去,这个配置类基本就是用@configuration注解和@bean注解来定义的,import就可以将bean注入到ioc容器中,但这里的import它传入的是一个ImportSelector的实现类,@AutoConfigurationImportSelector,它实现了ImportSelector,重写了selectImports这个方法,这个方法主要有两个作用,第一个就是它会去筛选我们的配置类,就是只有满足条件的bean才能进行装配,它其实就是通过METE-INF/spring-autoconfigure-metadata.properties这个配置文件中去筛选的,这个配置文件的话其实就相当于一个个@conditional这个注解,就是一些条件的判断,当满足什么什么条件时加载这个bean,其实就是一个过滤筛选的作用。
  3. 然后这个selectimports方法的第二个作用就是收集符合条件的配置类完成自动装配,就是通过autoConfigurationEntry.getConfigurations()这个方法实现的,其实在实际执行过程中的话它是同过ConfigurationClass的这个增强器PostProcessor中的BeanDefinitions这个方法来扫描注册配置类的Bean的,最终的话也还是会调用autoConfigurationEntry这个方法获得需要自动配置的配置类的。
  4. 其实这个autoConfigurationEntry,这个配置类的收集方法它里面的话也定义了很多的方法,比如getAttributes获得这个@EnableAutoConfiguration注解中的属性,还有一些去重啊就是去除重复类啊、最核心的话是这个canditate这个方法,就是getCandidateConfigurations这个方法,它会获得所有的自动装配的配置类,其实也就是METE-INF/spring.factories这个文件中的value,其实这个candidate这个方法的话也是用到了spring中的加载方式,就是SpringFactoriesLoader,它就会从spring.factories这个文件中找到对应key的value,比如说我们现在自动装配的话那key就是EnableAutoConfiguration,然后的话取到这个接口的对应实现类,实现类的话也是很多的,然后candidate拿到这些实现类的话就会经过去重啊、筛选啊等等选出我们要的实现类。
  5. 就比如说redis的自动配置类,就是RedisAutoConfiguration这个类,这个类上面的话是有@Configuration表示它是一个配置类,然后@ConditionalOnClass()这个注解它其实会判断我们的这个redisTemplate是否在类路径下,因为我们引入了spring-boot-starter-data-redis这个起步依赖,那它所对应的类比如redistemplate也会存在于类路径下,这个时候就会吧redistemplate这个bean注入到ioc容器中,其实这个的话也就是springboot我们引入什么依赖才会将它所对应的bean注入到ioc容器中,没有用到的依赖就不会注入,这个的话就是springboot自动装配的原理。

手写starter

核心三点:

  1. 相关组件的jar包依赖
  2. 自动完成bean的装配
  3. 加载application.properties文件中的属性配置

要求:写一个组件来实现redisTemplate的自动装配
步骤:
1 创建一个工程
5. 添加jar包依赖

		<dependency><groupId>org.redission</groupId><artifactId>redission</artifactId><version>3.11.1</version></dependency>

3.定义属性类,@ConfigurationProperties这个注解作用就是吧当前类中的属性和我们配置文件中的配置进行绑定,并且前缀是gp.redisson

package cn.itcast.demo;import io.netty.util.Timeout;
import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "gp.redission")
public class RedissonProperties {private String host = "localhost";private String password;private int port = 6379;private int timeout;public void setHost(String host) {this.host = host;}public void setPassword(String password) {this.password = password;}public void setPort(int port) {this.port = port;}public void setTimeout(int timeout) {this.timeout = timeout;}public void setSsl(boolean ssl) {this.ssl = ssl;}public String getHost() {return host;}public String getPassword() {return password;}public int getPort() {return port;}public int getTimeout() {return timeout;}public boolean isSsl() {return ssl;}private boolean ssl;
}

4.定义需要自动装配的配置类,吧RedissionClient装配到ioc容器。
在这里插入图片描述
注意:这里需要说明一下,我们引入的是redission依赖,那我们想要用redisTemplate,什么时候将其注入到bean呢?那就是@ConditionalOnClass(redission.class)在类路径下存在的情况下注入,其实它就是个判断条件,我们不能说吧我们没有引入的依赖注入到ioc容器吧,那肯定是引入了什么依赖吧对应的依赖的bean注入到ioc容器中,这里的话redission就充当了条件,我们用redission当作条件指明现在是引入了redission依赖了,我们要将操作redis的bean注入ioc,那如果不判断的话,我们pom文件引入的依赖怎么用呢?或者说我们怎么知道该注入哪些bean呢?其实就是pom文件我们引入的依赖所引起来的,这其实就是springboot较spring做的改进,spring我们注入bean需要手动加配置类加bean才能注入,那如果注入的特别多是不是很繁琐呢?springboot自动装配是实现了用什么依赖我注依赖所对应的bean,不需要我们手动注入,非常大的改进。

5.在resource下创建METE-INF/spring.factories文件,使得springboot程序可以扫描到该文件完成自动装配,key和value对应如下:
在这里插入图片描述
6.使用:添加starter依赖、设置属性配置,然后autowired就可以注入了
在这里插入图片描述

手写starter总结:

starter的作用就是引入了相应的jar包依赖,自动实现与该依赖有关的bean的注入,并且将我们在resource下配置文件中配置的数据和引入的这个依赖的属性类中的属性进行绑定。

相关文章:

springboot自动装配原理,手写一个starter。

文章目录 springboot自动装配原理手写starter手写starter总结&#xff1a; springboot自动装配原理 口述&#xff1a; springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖&#xff0c;它就能完成这个依赖组件相关Bean的自动注入&#xff0c;其实就是自动的将…...

革命性的电子元件:RAD继电器 | 百能云芯

在现代电子和通信系统中&#xff0c;RAD继电器是一种关键的电子元件&#xff0c;它在各种应用中发挥着重要作用。RAD继电器&#xff08;Reed-relay Actuated Device&#xff09;是一种基于磁性原理的电子开关&#xff0c;其特点是极其高速、可靠、低功耗和长寿命。下面云芯将为…...

文献阅读:Deep Learning Enabled Semantic Communication Systems

目录 论文简介关于文章内容的总结引申出不理解的问题 论文简介 作者 Huiqiang Xie Zhijin Qin Geoffrey Ye Li Biing-Hwang Juang 发表期刊or会议 《IEEE TRANSACTIONS ON SIGNAL PROCESSING》 发表时间 2021.4 这篇论文由《Deep Learning based Semantic Communications: A…...

巨人互动|游戏出海游戏出海效果怎样?

游戏出海是指将原本面向国内市场的游戏产品进行调整和优化&#xff0c;以适应海外市场的需求&#xff0c;并进行推广和销售。下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点。 1、市场扩大 通过游戏出海&#xff0c;可以将游戏产品的目标受众从国内扩展到全球范围内…...

二、GoLang输出HelloWorld、变量定义、数据类型的转换

一、输入Hello World go语言中&#xff0c;想要输出内容到控制台&#xff0c;package必须是main&#xff0c;包括方法名也必须是main&#xff0c; go语言输出的语法是 fmt 库。 package mainimport "fmt"func main() {// go语言中 输出内容 使用的库是 fmt库fmt.Pr…...

Mars3d图层树//图层管理加载时设置默认折叠的状态

问题&#xff1a;Mars3d图层树//图层管理加载时设置默认折叠的状态。 设置参考&#xff1a; 有个参数 open:false&#xff0c;写在对应的图层配置下&#xff0c;比如某个节点不展示&#xff0c;就对这个节点配置下。 如果全局&#xff0c;可以搜下这个widget内的代码&#xff…...

区块链技术|DApp与传统应用程序的关键区别

在数字时代&#xff0c;应用程序已经成为我们生活的一部分&#xff0c;无论是社交媒体、金融服务还是娱乐媒体&#xff0c;应用程序几乎无处不在。然而&#xff0c;随着区块链技术的崭露头角&#xff0c;一种新型应用程序——去中心化应用程序&#xff08;DApp&#xff09;正在…...

Python 加密解密技巧大揭秘:让你的数据安全无忧

建议食用原文链接效果更佳 Python 加密解密技巧大揭秘&#xff1a;让你的数据安全无忧 今天我们将探讨在 Python 中常见的加密解密算法&#xff0c;并通过代码案例来帮助大家更好地理解它们的实现。 在开始之前&#xff0c;请确保您已经安装了 pycryptodome 这个库。您可以使用…...

C#判断字符是否为utf16编码

unity截取显示微信昵称后&#xff0c;出现异常Error: UTF-16 to UTF-8 conversion failed because the input string is invalid&#xff0c;原因是截取字符串刚好截到了表情后面&#xff0c;解决思路是从截取到的索引向前遍历&#xff0c;找第一个不是utf16编码的字符&#xf…...

centos7上hive3.1.3安装及配置

1、安装背景&#xff1b; hive是基于hadoop的数据仓库软件&#xff0c;部署运行在linux系统之上&#xff0c;安装之前必须保证hadoop环境运行正常&#xff0c;hive本身不是分布式软件&#xff0c;它的分布式主要是借助hadoop实现&#xff0c;存储是hdfs&#xff0c;计算是mapr…...

Redis面试题(笔记)

目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 小结 4.缓存-双写一致性 5.缓存-持久性 6.缓存-数据过期策略 7.缓存-数据淘汰策略 数据淘汰策略-使用建议 数据淘汰策略总结 8.redis分布式锁 setnx redission 主从一致性 9.主从复制、主从同步 10.哨兵模式 服务状态监…...

iPhone 15 Pro展示设计:7项全新变化呈现

我们不应该再等iPhone 15 Pro在苹果9月12日的“Wonderlust”活动上发布了&#xff0c;而且可能会有很多升级。有传言称&#xff0c;iPhone 15 Pro将是自iPhone X以来最大的飞跃&#xff0c;这要归功于大量的新变化&#xff0c;从带有更薄边框的新钛框架到顶级A17仿生芯片和动作…...

【六袆 - Windows】PL/SQL instantclient安装包下载;PL/SQL双击登录配置

安装 PL/SQL 15 OMIT Oracle Instant Client Downloads for Microsoft Windows (x64) 64-bit https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 配置 # tnsnames.ora Network Configuration File:E:\oracle\product\10.2.0\db_1\ne…...

Springboot+mybatis-plus+dynamic-datasource 切换数据源失败问题总结

Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结0.前言1. dynamic-datasource 切换数据源失败场景总结1. spring-batch整合情况下切换数据源异常解决办法&am…...

QuantLib学习笔记——InterestRate的应用

⭐️ 单利还是复利 巴菲特老爷子有句名言&#xff1a;“人生就像滚雪球&#xff0c;重要的是发现很湿的雪和很长的坡。” 很湿的雪&#xff0c;指的就是复利。很长的坡&#xff0c;指的就是时间。很湿的雪和很长的坡组合起来&#xff0c;就能滚成巨大的雪球。 哈哈&#xff0…...

记录--解决前端内存泄漏:问题概览与实用解决方案

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 内存泄漏是前端开发中的一个常见问题&#xff0c;可能导致项目变得缓慢、不稳定甚至崩溃。在本文中&#xff0c;我们将深入探讨在JavaScript、Vue和React项目中可能导致内存泄漏的情况&#xff0c;并提…...

IP初学习

1.IP报文 首部长度指的是报头长度&#xff0c;用于分离报头和有效载荷 2.网段划分 IP地址 目标网络 目标主机 3.例子 4.特殊的IP地址 5.真正的网络环境 6.调制解调器 “猫”&#xff0c;学名叫宽带无线猫 7.NAT 源IP在内网环境不断被替换 8.私有IP不能出现在公网上 因…...

live5555 testProgs目录

文章目录 测试testProgs视频流直播流注意&#xff1a; 测试 testProgs 当涉及到许多示例程序时&#xff0c;解释每一个都可能会变得非常冗长。然而&#xff0c;我可以为你提供一些关键示例程序的简要解释&#xff0c;以帮助你了解每个示例的用途和功能&#xff1a; testOnDem…...

yolov5模型s,l,m,x的区别

yolov5s 是什么&#xff1f;yolov5系列最小的模型&#xff0c;s是small。 适合什么情况下使用&#xff1f;适合在计算资源有限的设备上使用。如移动设备或边缘设备。 速度和准确率&#xff1a;速度最快&#xff0c;准确率最低。 输入分辨率&#xff1a;通常为640x640 # Param…...

Springboot 实践(13)spring boot 整合RabbitMq

前文讲解了RabbitMQ的下载和安装&#xff0c;此文讲解springboot整合RabbitMq实现消息的发送和消费。 1、创建web project项目&#xff0c;名称为“SpringbootAction-RabbitMQ” 2、修改pom.xml文件&#xff0c;添加amqp使用jar包 <!-- RabbitMQ --> <dependency&g…...

Linux音频音量太小?别急着改代码,试试amixer这个终端神器

Linux音频音量调整终极指南&#xff1a;告别代码级修改&#xff0c;掌握amixer命令行艺术 当你在深夜调试语音识别项目时&#xff0c;突然发现树莓派录制的样本几乎听不见&#xff1b;或是准备录制技术教程视频时&#xff0c;Ubuntu系统的输出音量小得可怜——这种场景下&#…...

港科夜闻 | 香港科大“长者护脑社区计划“为6,000名长者提供阿尔兹海默症早筛

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科技大学3月23日宣布推出为期五年的 “长者护脑社区计划”。这项开创性计划以社区为本&#xff0c;旨在为香港基层长者提供阿尔兹海默症及轻度认知障碍的早期检测。香港科大将联同东华学院及十多间社福机构&#xff0c;…...

ChatGPT_JCM路由管理策略:SPA应用的导航设计与实现

ChatGPT_JCM路由管理策略&#xff1a;SPA应用的导航设计与实现 【免费下载链接】ChatGPT_JCM 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGPT_JCM ChatGPT_JCM是一个基于Vue2开发的OpenAI Web管理界面&#xff0c;提供完整的路由管理策略和单页面应用导航设计。…...

开发者的软实力:沟通、协作与影响力的修炼手册

在软件开发的精密世界里&#xff0c;代码是骨骼&#xff0c;架构是经脉&#xff0c;而沟通、协作与影响力&#xff0c;则是驱动整个系统顺畅运行的血液与神经。对于软件测试从业者而言&#xff0c;这种认知尤为深刻。我们早已超越了“找Bug”的单一角色&#xff0c;成为质量文化…...

LeetCode 热题100——128.最长连续序列

题目&#xff1a;给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1&#xff1a;输入&#xff1a;nums [100,4,200,1,3,2] 输出&…...

基于Wan 3D Causal VAE(Show-o2)的模型,重新完整地分析 10分钟的视频 对应多少 vison token

可以。这次我按 Show-o2 官方 432432 配置 和 Wan 3D Causal VAE 的公开时间压缩规则,把 10B token 且全部都是 vision token 的情况重新完整算一遍。下面的“大小”我统一按 未压缩 RGB 原始数据量 来算;如果你问的是实际 JPG / PNG / MP4 落盘大小,那会随压缩格式、码率和…...

阿里达摩院GTE中文向量模型效果展示:中文方言书面语语义对齐能力验证

阿里达摩院GTE中文向量模型效果展示&#xff1a;中文方言书面语语义对齐能力验证 1. 模型核心能力概览 GTE (General Text Embeddings) 是阿里达摩院推出的通用文本向量模型&#xff0c;专门针对中文场景深度优化。这个模型最大的特点是将文本转换为高质量的1024维向量表示&a…...

OpenClaw多模态研究:Qwen2.5-VL-7B在学术资料分析中的应用

OpenClaw多模态研究&#xff1a;Qwen2.5-VL-7B在学术资料分析中的应用 1. 为什么选择OpenClawQwen2.5-VL进行学术研究 去年冬天整理博士论文参考文献时&#xff0c;我对着堆积如山的PDF文件突然意识到&#xff1a;传统文献管理工具只能解决"存储"问题&#xff0c;却…...

IDEA插件MyBatisX实战:3分钟搞定SpringBoot项目CRUD代码生成

MyBatisX插件全流程实战&#xff1a;SpringBoot项目CRUD代码生成效率革命 在快节奏的企业级开发中&#xff0c;重复编写基础CRUD代码就像在键盘上跳机械舞——动作标准却毫无新意。当项目包含20张以上数据表时&#xff0c;手动创建Entity、Mapper、Service等层级代码会消耗开发…...

算法部署设计,Sm3国密算法的硬件ip设计,纯v手写代码,图一为ip接口,图二为资源消耗

算法部署设计&#xff0c;Sm3国密算法的硬件ip设计&#xff0c;纯v手写代码&#xff0c;图一为ip接口&#xff0c;图二为资源消耗&#xff0c;图三四为封装为axilite接口并在开发版下板测试&#xff0c;图五为开发版实测结果 直接联系内容包括:sm3的软件python实现代码&#xf…...