玩转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 ...
随机推荐
- memoのls
memoのls 测试环境是Big Sur 11.2.2 在windows下都不知道cd /D E:\xxx\xxx可以直接切换盘符.今天才发现,ls命令我也不会用-- ls命令是真强大啊,之前只知道l ...
- 天龙八部<三联版>四 终
叶二娘与虚竹相认,但黑衣僧却一语道破天机,原来虚竹乃是叶二娘与少林一位高僧的私生子,而黑衣僧,便是三十年前雁门关外的男主演萧远山,虚竹是萧远山所盗,而原因是因为虚竹的父亲乃是当年的带头大哥.迫于压力玄 ...
- 20211306丁文博 python技能树、CSDN MarkDown编辑器
测评内容: python技能树.CSDN MarkDown编辑器 指导老师:王志强 班级:2113 学号:20211306 姓名:丁文博 https://blog.csdn.net/weixin_62 ...
- Docker基本命令之 容器管理
容器管理 查看正在运行的容器: docker ps 查看完整信息:docker ps --no-trunc 查看在运行或停止运行的容器:docker ps -a 查看容器系统资源的使用情况:docke ...
- Mybatis配置报错:Failed to configure a DataSource: 'url' attribute is not specified and no embe...
问题分析及解决方案 问题原因: Mybatis没有找到合适的加载类,其实是大部分spring - datasource - url没有加载成功,分析原因如下所示. DataSourceAutoConf ...
- InnoDB的全文检索
InnoDB的全文检索 注:全文为MySQL官网5.7的文档(MySQL 8.0的文档与此几乎一致) MySQL 5.6 不支持中.日.韩语,因为无法对其分词,5.7版本引入NGram(基于字符)对中 ...
- LeetCode 刷题感想之动态规划
在 LeetCode/剑指Offer 上刷了500题左右了,应该写一篇文章总结一下自己的感想.因为我自己是测试,所以从测试角度来写感受吧. 先说动态规划. 什么是动态规划?是经典算法思想之一,是自底向 ...
- openwrt扩容
方法二.三记得先使用Linux系统打开 GParted -- Download 方法三偏移地址获取: 1. 运行的openwrt安装losetup 2. 安装完毕后执行:losetup 获取偏移地址. ...
- 使用React脚手架初始化项目
1.npx create-react-app my-app------>是项目名 2.cd my-app 3.npm start
- Python爬虫iP被封的怎么办?
对于经常做数据爬虫的程序员来说,除了要写出简洁方便的代码.还需要解决的是网站反爬的问题.有时候我们在爬取数据的时候突然报出错或者目标网站错误代码. 比如说:403 Forbidden错误," ...