手写一个starter来理解SpringBoot的自动装配

自动装配以及简单的解析源码

自动装配是指SpringBoot在启动的时候会自动的将系统中所需要的依赖注入进Spring容器中
我们可以点开@SpringBootApplication这个注解来一探究竟
在这里插入图片描述
点开这个注解可以发现这些
在这里插入图片描述
我们点开@SpringBootConfiguration这个注解
在这里插入图片描述
可以发现实际上@SpringBootApplication这个其实是一个配置类
再点开@EnableAutoConfiguration(允许自动配置)这个注解,
在这里插入图片描述
在这里最重要的是@AutoConfigurationPackage@Import这两个注解
@AutoConfigurationPackage这个注解的作用是扫描与启动类同目录底下的所有包以及其子包,将相关的Bean注入进Spring容器中
@Import注解则是将AutoConfigurationImportSelector.class将这个类作为Bean注入进Spring容器中,我们再点开这个类来看看
在这里插入图片描述
找到这个方法,然后再点 loadFactoryNames这个方法
在这里插入图片描述
我们可以看到这段代码,这段代码的意思就是说,加载META-INF/spring.factories 这个目录底下的配置类到Spring容器里面,再根据配置类来生成相应的Bean对象
所以说这两个注解,一个是将同一个项目里面的bean注入进Spring容器中,另外一个注解是将别人写好的配置类里面的Bean注入进Spring容器中

手写一个starter帮助理解自动装配

手把手教学

首先创建一个maven工程,名字应该是xxx-spring-boot-starter(Spring官方规定,如果是第三方的starter命名规则应该是xxx-spring-boot-starter,而Spring官方的starter应该是spring-boot-xxx-starter)
创建好了以后添加如下依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.2</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency></dependencies>

然后我们创建两个类
在这里插入图片描述
ConfigProperties 这个类是与Spring的配置文件关联的,配置文件中的值会被注入相应的字段中
@ConfigurationProperties(prefix = "dxg")这个注解的意思就是,在配置文件中相关配置前缀是什么

package com.DXG.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "dxg")
public class ConfigProperties {private Integer age;private String name;public ConfigProperties(){}public ConfigProperties(Integer age, String name) {this.age = age;this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

然后我们再编写这个配置类

@Configuration
@EnableConfigurationProperties(ConfigProperties.class)
public class ConfigPropertiesAutoConfiguration {public ConfigProperties configProperties;public ConfigPropertiesAutoConfiguration(ConfigProperties configProperties){this.configProperties = configProperties;}
}

在这个配置类中,首先打上@Configuration这个注解表明这是一个配置类
然后再打上@EnableConfigurationProperties(ConfigProperties.class)这个注解,这个注解的意思是让使用了@ConfigurationProperties(prefix = "dxg")ConfigProperties.class注入进IOC容器中
然后我们就可以根据配置来生成相应的Bean了,比如我们编写了两个Bean

    @Beanpublic TestService testService(){return new TestService(configProperties.getAge(), configProperties.getName());}@Beanpublic TestService1 testService1(){return new TestService1(configProperties.getAge());}
package com.DXG.service;public class TestService {private Integer age;private String name;public TestService(Integer age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "ConfigProperties{" +"age=" + age +", name='" + name + '\'' +'}';}
}
package com.DXG.service;public class TestService1 {private Integer age;public TestService1(Integer age) {this.age = age;}@Overridepublic String toString() {return "TestService1{" +"age=" + age +'}';}
}

最重要的一步来了,我们需要在META-INF这个目录下面创建spring.factories这个文件
在这里插入图片描述
在这里面输入我们的配置类,这样才能被SpringBoot扫描到然后加载进Spring容器里面生成相应的Bean

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.DXG.config.ConfigPropertiesAutoConfiguration

然后我们打包这个项目,生成相应的jar包
在这里插入图片描述
接下来我们就需要测试自动装配到底有没有生效了
在创建一个项目然后引入这个jar包

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.2</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.DXG</groupId><artifactId>test-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

编写相应的代码来进行测试

在这里插入图片描述

package com.DXG.controller;import com.DXG.service.TestService;
import com.DXG.service.TestService1;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@RequestMapping("/test/")
public class TestController {@Resourceprivate TestService testService;@Resourceprivate TestService1 testService1;@RequestMapping("/testString")public String testString(){return testService.toString();}@RequestMapping("/testString1")public String testString1(){return testService1.toString();}
}

在配置文件里面填写相应的配置

server:port: 8080dxg:age: 12name: "DXG"

接下来启动SpringBoot项目
在这里插入图片描述
在这里插入图片描述
可以看到,确实是将两个Bean都注入进Spring容器中供我们使用了

总结

接下来画个流程图总结一下
在这里插入图片描述

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

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

相关文章

C# 使用Fleck创建WebSocket服务器

目录 写在前面 代码实现 服务端代码 客户端代码 调用示例 写在前面 Fleck 是 C# 实现的 WebSocket 服务器&#xff0c;通过 WebSocket API&#xff0c;浏览器和服务器只需要做一个握手的动作&#xff0c;然后浏览器和服务器之间就形成了一条快速通道&#xff1b;两者之间…

深度学习笔记(三)——NN网络基础概念(神经元模型,梯度下降,反向传播,张量处理)

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图部分引用自北京大学机器学习公开课 人工智能算法的主流分类 首先明白一个概念&#xff0c;广义上的人工智能算法并不是只有Machine Learning或Deep …

什么牌子的洗地机清洁效果强?性能超好的洗地机推荐

随着生活品质的提高&#xff0c;家庭清洁也逐渐成为了人们生活中重要的一环。而传统的拖把方式已经无法满足人们对于清洁效果和舒适度的需求。因此&#xff0c;洗地机作为现代家庭清洁的利器受到了越来越多人的追捧。今天&#xff0c;我们将为大家带来几款清洁力强的、性能超好…

TS 36.331 V12.0.0-过程(4)-测量

​本文的内容主要涉及TS 36.331&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

【三】把Python Tk GUI打包exe可执行程序,移植到其他机器可用

背景 这是一个系列文章。上一篇【【二】为Python Tk GUI窗口添加一些组件和绑定一些组件事件-CSDN博客】 使用python脚本写一个小工具。因为命令行运行的使用会有dos窗口&#xff0c;交互也不是很方便&#xff0c;开发环境运行也不方便分享给别人用&#xff0c;所以想到…

【AIGC】一组精美动物AI智能画法秘诀

如何使用AI绘画&#xff0c;从以下角度&#xff0c;依据表格内容梳理&#xff0c;表格如下&#xff1a; 外貌特征物种姿势特征描述场景风格技术描述小巧可爱幼小浣熊倚在桌子上具有人形特征中世纪酒馆电影风格照明8k分辨率细节精致毛茸茸手持咖啡杯Jean-Baptiste Monge的风格蓝…

登录模块的实现

一.前期的准备工作 1.页面的布局 (1)表单的校验: 利用element-ui提供的文档绑定rules规则后实现校验 (2)跨域的配置 &#xff1a; 利用proxy代理来解决跨域的问题 (3)axios拦截器的配置 两个点:1. 在请求拦截的成功回调中,如果token,因为调用其它的接口需要token才能调取。 在请…

MongoDB调优

三大导致 MongoDB 性能不佳的原因 1&#xff09;慢查询2&#xff09;阻塞等待3&#xff09;硬件资源不足1,2通常是因为模型/索引设计不佳导致的。排查思路&#xff1a;按1-2-3依次排查。 影响 MongoDB 性能的因素 MongoDB 性能监控工具 Free Monitoring 从版本 4.0 开始&am…

【设计模式】01-前言

23 Design Patterns implemented by C. 从本文开始&#xff0c;一系列的文章将揭开设计模式的神秘面纱。本篇博文是参考了《设计模式-可复用面向对象软件的基础》这本书&#xff0c;由于该书的引言 写的太好了&#xff0c;所以本文基本是对原书的摘抄。 0.前言 评估一个面向对…

Demo: 给图片添加自定义水印并下载

给图片添加自定义水印并下载 <template><div class"wrap"><div class"optea"><div class"file-upload"><p>选择图片</p><el-button type"text" style"color: #c00;"><label f…

Spacedesk | 最新版本移动端扩展PC副屏

我的设备&#xff1a; 电脑:戴尔G15 5511、i7-11800H、Windows 11、RTX3060&#xff08;推荐显卡高级一些&#xff0c;算力差点的可能带不动这款软件&#xff09; 平板&#xff1a;荣耀V6、麒麟985、安卓10、分辨率2000*1200&#xff08;手机也行&#xff0c;我用的平板&…

Spark SQL进阶

DataFrame详解 清洗相关API 去重API 删除空缺值的API 替换缺失值的API from pyspark import SparkConf, SparkContext import os from pyspark.sql import SparkSession# 绑定指定的Python解释器 os.environ[SPARK_HOME] /export/server/spark os.environ[PYSPARK_PYTHON]…