玩转SpringBoot原理:掌握核心技术,成为高级开发者
本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件
- 步骤一:创建项目
- 步骤二:添加依赖
- 步骤三:创建自动配置类
- 步骤四:创建属性类
- 步骤五:创建服务类
- 步骤六:添加自动配置类到Springboot自动配置列表中
- 步骤七:打包并发布
- 步骤八:在其他项目中使用自定义starter
- 结论
步骤一:创建项目
世界上最伟大的成就,不是从不失败,
而是每次失败后,仍能振作起来。
首先,我们需要创建一个Springboot项目。删除启动类,配置文件,添加META-INF文件夹和spring.factories,最终项目结构如下
步骤二:添加依赖
在创建完项目后,我们需要在pom.xml文件中添加以下三个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.7.0</version>
<optional>true</optional>
</dependency>
第一个依赖是Springboot的starter依赖,第二个依赖是Springboot的自动配置依赖。第三个是自动生成帮助文档和元数据,以帮助IDE自动完成和参数提示。
步骤三:创建自动配置类
当你感到疲惫时,不要停下脚步,
因为你不知道,下一步可能就是成功。
自动配置类是整个自定义starter的核心部分。我们需要在自动配置类中完成以下任务:
- 使用
@Configuration注解将该类标记为配置类。 - 使用
@EnableConfigurationProperties注解引入属性配置类。 - 使用
@Bean注解将自定义服务类注入到Spring容器中。
下面是一个示例代码:
@Configuration
@EnableConfigurationProperties(YoulaiProperties.class)
public class YoulaiAutoConfiguration {
private final YoulaiProperties properties;
public YoulaiAutoConfiguration(YoulaiProperties properties) {
this.properties = properties;
}
@Bean
public YoulaiService myService() {
return new YoulaiService(properties.toString());
}
}
步骤四:创建属性类
光阴似箭,日月如梭,生命短暂而珍贵,
让我们在有生之年做自己想做的事情。
属性类用来存储自定义的配置属性。我们需要在属性类中完成以下任务:
- 使用
@ConfigurationProperties注解将该类标记为属性类。 - 使用
prefix属性指定属性名前缀。 - 定义对应的属性字段,并提供
getter和setter方法。
下面是一个示例代码:
@Component
@ConfigurationProperties(prefix = "youlai")
public class YoulaiProperties {
private String bio = "youlai-mall 是基于Spring Boot 2.7、Spring Cloud 2021 & Alibaba 2021、Vue3、Element-Plus、uni-app等全栈主流技术栈构建的开源商城项目,涉及 后端微服务、 前端管理、 微信小程序和 APP应用等多端的开发。";
private String serverPath="https://admin.youlai.tech/#/login?redirect=/dashboard";
private String apiPath="https://api.youlai.tech/doc.html#/home";
public String getBio() {
return bio;
}
public void setBio(String bio) {
this.bio = bio;
}
public String getServerPath() {
return serverPath;
}
public void setServerPath(String serverPath) {
this.serverPath = serverPath;
}
public String getApiPath() {
return apiPath;
}
public void setApiPath(String apiPath) {
this.apiPath = apiPath;
}
@Override
public String toString() {
return "YoulaiProperties{" +
"bio='" + bio + '\'' +
", serverPath='" + serverPath + '\'' +
", apiPath='" + apiPath + '\'' +
'}';
}
}
步骤五:创建服务类
服务类是自定义starter提供的服务。我们需要在服务类中定义服务方法,提供的服务。我这演示读取配置文件
下面是示例代码:
public class YoulaiService {
private String config;
public YoulaiService(String config) {
this.config = config;
}
public void doSomething() {
System.out.println("Config value is: " + config);
}
}
步骤六:添加自动配置类到Springboot自动配置列表中
为了让Springboot能够自动配置我们的starter,我们需要将自动配置类添加到META-INF/spring.factories文件中,springboot启动会读取这个文件,并将他注入到spring的容器中,如下所示:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.youlai.springbootstarter.YoulaiAutoConfiguration
除了这种自动装配,还有一种被动装配,由使用方决定是否需要装配,这种只需要定义一个注解就好了
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(YoulaiAutoConfiguration.class)
public @interface EnableYoulai {
}
步骤七:打包并发布
完成以上步骤后,我们可以使用Idea将项目打包并发布到Maven仓库中,我这里演示打包到本地
步骤八:在其他项目中使用自定义starter
成功不是偶然的,而是你日复一日努力的结果,
永远不要放弃自己的梦想。
在其他Springboot项目中,我们只需要在pom.xml文件中添加以下依赖即可:
<dependency>
<groupId>com.youlai-learing</groupId>
<artifactId>youlai-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
如果是被动装配,则在启动类加上开启注解:
@SpringBootApplication
@EnableYoulai
public class SpringbootStarterConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStarterConsumerApplication.class, args);
}
}
然后就可以在代码中使用我们在自定义starter中提供的服务了,如下所示:
@Resource
private YoulaiService youlaiService;
@Test
void contextLoads() {
youlaiService.doSomething();
}
完整代码地址:https://gitee.com/youlaiorg/youlai-learning.git
结论
通过本文的介绍,我们学习到如何编写Springboot自定义starter,并且清楚了springboot自动装配的原理
把握当下,不留遗憾,珍惜身边人,
感恩生命中的每一个瞬间。
玩转SpringBoot原理:掌握核心技术,成为高级开发者的更多相关文章
- 【玩转SpringBoot】用好条件相关注解,开启自动配置之门
自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...
- 【玩转SpringBoot】翻身做主人,一统web服务器
寄人篱下的日子 一直以来受传统影响,我们的web工程总是打成war包,然后放入tomcat的webapps目录下面. 如下图01: 当tomcat启动时,会去解压war包,然后运行web工程.这大家都 ...
- 【玩转SpringBoot】让错误处理重新由web服务器接管
其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...
- 【玩转SpringBoot】异步任务执行与其线程池配置
同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...
- 深入springboot原理——动手封装一个starter
从上一篇文章<深入springboot原理——一步步分析springboot启动机制(starter机制)> 我们已经知道springboot的起步依赖与自动配置的机制.spring-bo ...
- 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇
概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...
- 玩转 SpringBoot 2 之整合 JWT 下篇
前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...
- 玩转 SpringBoot 2 之整合 JWT 上篇
前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合 JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术, ...
- 【玩转SpringBoot】给自动配置来个整体大揭秘
上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...
- 【玩转SpringBoot】看似复杂的Environment其实很简单
喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声. 十年前读大学时,学校开设了C语言还有C++.但是学习这两种语言,对于新手来说非常没有成就感. 于是我就在校门口买个光盘,装个VS ...
随机推荐
- docker搭建phpswoole实现http服务
一.创建Dockerfile FROM phpswoole/swoole # COPY ./www/ /var/www/ 二.同级目录下创建docker-compose.yml services: p ...
- <一>JDK/MAVEN/IDEA/MYSQL/GIT详细环境安装
一. 安装JDK 1. jdk安装包下载地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html 2. 解压缩软 ...
- JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generators/yield、async/awt
所有异步任务都是在同步任务执行结束之后,从任务队列中依次取出执行. 回调函数是异步操作最基本的方法,比如AJAX回调,回调函数的优点是简单.容易理解和实现,缺点是不利于代码的阅读和维护,各个部分之间高 ...
- MySQL中的json函数
json_valid 判断是否为合法json文档 json_unquote 去除json字符串的引号,将值转成string类型 json_extract 提取json值
- opencv对鱼眼图像畸变矫正
import numpy as np ''' #T_cam_imu body_T_cam0: !!opencv-matrix rows: 4 cols: 4 dt: d data: [0.003489 ...
- 狐漠漠养成日记 Cp.00002 第一周
主要目标 (1)考研 考研数学二16-22年的真题卷(已完成真题卷:0/7) 记忆考研英语中高频词汇(已记忆词汇:高频:0/10:中频:0/10) 考研英语二16-22年的真题卷(已完成真题卷:0/7 ...
- Bug的前后台分类及定位技巧
必备工具:Firefox debug工具 一般浏览器F12即可 如何区分页面的bug问题归属:前端or后端 前端bug主要分为3个类别:HTML,CSS,Javascript三类问题 给个最大的区 ...
- xml与DataSet互转
//将DataSet转换为xml字符串 public static string ConvertDataSetToXMLFile(DataSet xmlDS, Encoding encoding) ...
- 如何卸载inventor 2023?怎么把inventor彻底卸载删除干净重新安装的方法【转载】
inventor 2023卸载重新安装方法,使用清理卸载工具箱完全彻底删除干净inventor 2023各种残留注册表和文件.inventor 2023显示已安装或者报错出现提示安装未完成某些产品无法 ...
- 1、Java程序概述
1.什么是Java? Java是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码,以及一个提供诸如安全性.跨操作系统的可移植性以及自动垃圾收集等服务的执行环境. 2.Java白皮书的关键术语 ...