本文通过编写一个自定义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属性指定属性名前缀。
  • 定义对应的属性字段,并提供gettersetter方法。

下面是一个示例代码:

@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原理:掌握核心技术,成为高级开发者的更多相关文章

  1. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  2. 【玩转SpringBoot】翻身做主人,一统web服务器

    寄人篱下的日子 一直以来受传统影响,我们的web工程总是打成war包,然后放入tomcat的webapps目录下面. 如下图01: 当tomcat启动时,会去解压war包,然后运行web工程.这大家都 ...

  3. 【玩转SpringBoot】让错误处理重新由web服务器接管

    其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...

  4. 【玩转SpringBoot】异步任务执行与其线程池配置

    同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...

  5. 深入springboot原理——动手封装一个starter

    从上一篇文章<深入springboot原理——一步步分析springboot启动机制(starter机制)> 我们已经知道springboot的起步依赖与自动配置的机制.spring-bo ...

  6. 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  7. 玩转 SpringBoot 2 之整合 JWT 下篇

    前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...

  8. 玩转 SpringBoot 2 之整合 JWT 上篇

    前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合 JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术, ...

  9. 【玩转SpringBoot】给自动配置来个整体大揭秘

    上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...

  10. 【玩转SpringBoot】看似复杂的Environment其实很简单

    喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声. 十年前读大学时,学校开设了C语言还有C++.但是学习这两种语言,对于新手来说非常没有成就感. 于是我就在校门口买个光盘,装个VS ...

随机推荐

  1. [Unity3D 小Tricks] 如何修改Unity3d脚本默认模板?

    众所周知,unity默认的模板总是Update()和Start(),但往往我们并不需要,每次都要手动删除非常麻烦. 但可以更改如下模板文件 C:\Program Files\Unity 2020.3. ...

  2. sequelize关联相关表

    在article的迁移文件: 在commemt里面添加: 在单条查询里面 这样一个文章里面包含一个评论

  3. Java中finalize()方法的使用

    参考:https://blog.csdn.net/m0_64624615/article/details/126326921 垃圾回收器

  4. python 创建虚拟环境python –m venv方式

    1.环境准备 1.1.刷新包清单 sudo yum update 1.2.安装SCL实用程序 sudo yum install centos-release-scl 1.3.安装Python 3.6 ...

  5. 圣诞树代码_HTML

    这个冬天给TA栽不一样的圣诞树 直接上效果 <!DOCTYPE html> <html lang="en" > <head> <meta ...

  6. 解决linux时间转换为yyyy-MM-dd

    linux时间显示为:Tue Nov 30 09:33:04 CST 2021 SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd ...

  7. 20200926--矩阵转置(奥赛一本通P95 8 多维数组)

    输入一个n行m列的矩阵A,输出它的转置(看下面说明) 输入:第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示矩阵A的行数和列数.接下来n行,每行m个整数 ...

  8. Yarn API

    Yarn API: 1. 查询整个yarn集群指标: GET http://{cluster_domain_name}|{rm_ip:8088}/ws/v1/metrics 2. 查看指定队列的所有任 ...

  9. Spring系列之基于 Java 的容器配置-9

    目录 组合基于 Java 的配置 使用`@Import`注解 有条件地包含`@Configuration`类或`@Bean`方法 结合 Java 和 XML 配置 组合基于 Java 的配置 Spri ...

  10. centos7.2 64位安装php7.2.12

    1 安装php所需要的扩展 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl curl ...