手写一个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.rhkb.cn/news/238693.html

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

相关文章

What is `@Repository` does?

Repository 是Spring注解&#xff0c;标识数据访问层组件&#xff08;DAO, Data Access Object&#xff09; 当一个类被标记为 Repository 时&#xff1a; 1、组件扫描与自动代理&#xff1a; Spring通过组件扫描&#xff08;Component Scan&#xff09;机制发现带有 Reposit…

@FunctionalSpringBootTest 和@SpringBootTest注解的区别

FunctionalSpringBootTest 和 SpringBootTest 是Spring框架中用于测试的两个不同注解。下面是它们之间的主要区别&#xff1a; 用途和范围&#xff1a; SpringBootTest&#xff1a;这个注解用于需要测试Spring应用程序上下文的场合。它会加载完整的应用程序上下文&#xff0c;适…

LitJson-Json字符串转对像时:整型与字符串或字符串转:整型进的类型不一致的处理

目录 问题描述上代码测试代码各位看官&#xff0c;打赏个1元吧 Json数据格式是大家在游戏开中常量用的一种数据格式&#xff0c;某种程度上可以说是必备的。对unity开发来说&#xff0c;LitJson这个json库应该是被使用最多的json库了。 问题描述 今天说要的其中的这个api: Jso…

Linux知识(未完成)

一、Linux 1.1 Linux 的应用领域 1.1.1 个人桌面领域的应用 此领域是 Linux 比较薄弱的环节但是随着发展&#xff0c;近几年 linux 在个人桌面领域的占有率在逐渐提高 1.1.2 服务器领域 linux 在服务器领域的应用是最高的 linux 免费、稳定、高效等特点在这里得到了很好的…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表&#xff1f;还在为图表样式而烦恼&#xff1f;ioDraw为你提供一站式解决方案&#xff01;ioDraw在线图表工具实现了AI自动生成图表&#xff0c;让你轻松制作专业图表&#xff0c;只需3步&#xff01; 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

条款24:若所有参数皆需类型转换,请为此采用非成员函数

设计一个表示有理数的类时&#xff0c;允许从整数隐式转换为有理数是有用的&#xff1a; class Rational { public:Rational(int numerator 0, // 该构造函数没有explicit限制;int denominator 1); int numerator() const; int denominator() const; const Rational opera…

Python: vars()详细解释

vars() 是一个内置函数&#xff0c;用于返回一个对象的 __dict__ 属性。它接受一个对象作为参数&#xff0c;如果省略参数&#xff0c;它返回当前局部作用域的字典。 具体而言&#xff0c;vars() 的行为取决于参数的类型&#xff1a; 1. 没有参数&#xff1a; 如果没有提供参…

数据库SELECT语句

文章目录 一、检索数据二、排序检索三、过滤数据四、数据过滤4.1 组合WHERE子句1. AND操作符2. OR操作符3. 计算次序 4.2 IN操作符4.3 NOT操作符 五、用通配符过滤LIKE操作符1. 百分号&#xff08;%&#xff09;通配符2. 下划线&#xff08;_&#xff09;通配符 使用通配符的技…

vivado 使用Vitis HLS源、使用模型生成器源、使用系统生成器源

使用Vitis HLS源 AMD Vitis™ 高级综合&#xff08;HLS&#xff09;工具将C规范转换为寄存器传输级&#xff08;RTL&#xff09;实现&#xff0c;您可以将其合成到AMD设备中。你可以写CC、C或SystemC中的规范&#xff0c;AMD设备提供了大规模并行与传统处理器相比&#xff0c;…

04.SpringCloud网关-gateway

1.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

LeetCode 0082.删除排序链表中的重复元素 II:模拟

【LetMeFly】82.删除排序链表中的重复元素 II&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/ 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字…

如何正确使用数据库读写分离

背景 在应用系统发展的初期&#xff0c;我们并不知道以后会发展成什么样的规模&#xff0c;所以一开始不会考虑复杂的系统架构&#xff0c;复杂的系统架构费时费力&#xff0c;开发周期长&#xff0c;与系统发展初期这样的一个定位是不吻合的。所以&#xff0c;我们都会采用简…

Day6 Qt

思维导图 1.数据库增删改查 头文件widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> // 执行sql语句类 #include <QSqlRecord> //数据库记录类 #include <QSqlErro…

什么软件可以做报表?

数据报表&#xff0c;是商业领域中不可或缺的一部分&#xff0c;它通过表格、图表等形式&#xff0c;将复杂的数据进行整理、分析并呈现出来&#xff0c;帮助用户更好地理解数据的趋势和关系。数据报表不仅展示了业务现状和趋势&#xff0c;还支持多种数据分析和挖掘功能&#…

智慧康养项目:智能技术与产品提升老年人生活品质

智慧康养项目需要集成的一些独特的技术和产品&#xff0c;其中包括&#xff1a; 智能健康监测设备&#xff1a;我们开发了一款能够实时监测老年人身体状况的智能健康监测设备&#xff0c;包括血压、血糖、心率等指标。该设备通过数据分析处理&#xff0c;能够提供个性化的健康…

Java SE入门及基础(14)

二重循环 1. 什么是二重循环 二重循环就是一个循环结构中又包含另外一个循环结构 while ( 外层循环条件 ){ //外层循环操作 while ( 内层循环条件 ){ //内层循环操作 } //外层循环操作 } while ( 外层循环条件 ){ //外层循环操作 for ( 循环变量初始化 ; 内层循环条…

案例131:基于微信小程序的家庭事务管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

如何正确使用数据库的读写分离

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 背景 在应用系统发展的初期&#xff0c;我们并不知…

考古学家 - 华为OD统一考试

OD统一考试 分值: 200分 题解: Java / Python / C++ 题目描述 有一个考古学家发现一个石碑,但是很可惜发现时其已经断成多段。 原地发现N个断口整齐的石碑碎片,为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗? 备注: 如果存在石碑…

uniapp开发安卓应用微信开放平台创建应用如何获取签名

微信开放平台创建应用时需要应用的签名 比如我们开发了一个应用叫 “滴滴拉屎” 包名&#xff1a;uni.DIDILASHI #mermaid-svg-BUKbltDr30J93dUs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BUKbltDr30J93dUs .…