springboot的starter的作用就是自动装配。将配置类自动装配好放入ioc容器里。作为一个组件,提供给springboot的程序使用。

今天手写一个starter。功能很简单,调用starter内对象的一个方法输出"hello! xxx"

先来了解以下命名规范

  • 自定义 starter,工程命名格式为{xxx}-spring-boot-starter。

  • 官方starter,工程命名格式为spring-boot-starter-{xxx}。

1.新建一个普通的maven工程,引入springboot依赖(2.5.6),项目名为hello-spring-boot-starter

pom.xml

<dependencies>
<!--很关键-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
<version>2.5.6</version>
</dependency>
<!--springBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.6</version>
</dependency>
<!-- Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
<!--打pom包的插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

 2.编写业务类HelloStarter 

@Data                   //生成getset
@AllArgsConstructor //生成有参构造器
public class HelloStarter {
//业务类依赖的一些配置信息,通过spring.properties配置
private HelloProperties helloProperties; public String hello() {
return "hello! " + helloProperties.name;
}
}

 3.编写配置信息类

@ConfigurationProperties(prefix = "com.shuai.hello")  //绑定到spring.properties文件中
@Data
public class HelloProperties {
String name;
}

4. 编写自动配置类,将所有对象注入到容器中。

@Configuration      //表明这是一个springBoot的配置类
public class AutoConfiguration { @Bean //将对象放入IOC容器中,对象名就是方法名
public HelloProperties helloProperties(){
return new HelloProperties();
}
@Bean //将对象放入IOC容器中,对象名就是方法名
public HelloStarter helloStarter(@Autowired HelloProperties helloProperties){ //自动注入
return new HelloStarter(helloProperties);
}
}

5.为了让springboot容器扫描到配置类,建一个resource目录,一个META-INF文件夹和spring.factories文件

在spring.factories文件中写入

#等号后面是配置类的全路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.config.AutoConfiguration

6.使用install打包到本地仓库

注意:

所以一般我们使用install打包

 7.导入项目中进行测试

       <dependency>
<groupId>com.shuai</groupId>
<artifactId>hello-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
使用starter中的对象
@RestController
public class HelloController {
@Autowired
HelloStarter helloStarter;
@RequestMapping("/hello")
public String hello(){ return helloStarter.hello();
}
}
spring.properties中配置信息
com.shuai.hello.name="starter"

访问http://localhost:8080/hello 测试结果

非常棒!你现在已经会写一个简单的starter了,但是这远远不够,后续还要加上@EnableConfigurationProperties,@EnableConfigurationProperties等注解,让你的starter更加健壮

寄语:我们所要追求的,永远不是绝对的正确,而是比过去的自己更好。

手写一个springboot starter的更多相关文章

  1. 手撸一个SpringBoot的Starter,简单易上手

    前言:今天介绍一SpringBoot的Starter,并手写一个自己的Starter,在SpringBoot项目中,有各种的Starter提供给开发者使用,Starter则提供各种API,这样使开发S ...

  2. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  3. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  4. 摊牌了!我要手写一个“Spring Boot”

    目前的话,已经把 Spring MVC 相关常用的注解比如@GetMapping .@PostMapping .@PathVariable 写完了.我也已经将项目开源出来了,地址:https://gi ...

  5. 『练手』手写一个独立Json算法 JsonHelper

    背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...

  6. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  7. 【spring】-- 手写一个最简单的IOC框架

    1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...

  8. 放弃antd table,基于React手写一个虚拟滚动的表格

    缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...

  9. 只会用就out了,手写一个符合规范的Promise

    Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Prom ...

随机推荐

  1. 论文翻译:2021_ICASSP 2021 ACOUSTIC ECHO CANCELLATION CHALLENGE: INTEGRATED ADAPTIVE ECHO CANCELLATION WITH TIME ALIGNMENT AND DEEP LEARNING-BASED RESIDUAL ECHO PLUS NOISE SUPPRESSION

    论文地址:https://ieeexplore.ieee.org/abstract/document/9414462 ICASSP 2021声学回声消除挑战:结合时间对准的自适应回声消除和基于深度学习 ...

  2. Maven打包方式整理

    方法一 maven-jar-plugin和maven-dependency-plugin插件打包 <build> <plugins> <plugin> <gr ...

  3. IDEA超级好用的插件推荐

    IDEA超级好用的插件推荐 以下都是本人使用idea开发以来,所使用过的插件,强烈推荐,提升代码质量,事半功倍之首选!!! 先介绍下如何安装这些插件:(本人使用idea的版本是2020.2.3) 1. ...

  4. 拉普拉斯平滑(Laplacian smoothing)

    概念 零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是  $0$ .这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该 ...

  5. 微服务架构 | 3.1 Netflix Eureka 注册中心

    目录 前言 1. Eureka 基础知识 1.1 Eureka 模型中的服务器与客户端 1.2 Eureka 的 30s 启动机制 1.3 Eureka 为什么注册服务的 IP ,而不是主机名 1.4 ...

  6. 《剑指offer》面试题48. 最长不含重复字符的子字符串

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.   示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  7. IDEA2017 maven Spark HelloWorld项目(本地断点调试)

    作为windows下的spark开发环境 1.应用安装 首先安装好idea2017 java8 scalaJDK spark hadoop(注意scala和spark的版本要匹配) 2.打开idea, ...

  8. golang中内存地址计算-根据内存地址获取下一个内存地址对应的值

    package main import ( "fmt" "unsafe" ) func main() { // 根据内存地址获取下一个字节内存地址对应的值 da ...

  9. java继承成员变量特点

    1 /* 2 * 在子父类中,成员的特点体现. 3 * 1,成员变量. 4 * 2,成员函数. 5 * 3,构造函数. 6 */ 7 8 //1, 成员变量. 9 /* 10 * 当本类的成员和局部变 ...

  10. a 标签一些特殊用法

    发邮件 <a href="mailto:youemail@mail.com?subject=邮件标题&body=邮件内容">告诉我们</a> 打电话 ...