Spring Boot starter原理

Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!starter可以理解为一个依赖组,其主要功能就是完成引入依赖初始化配置。Spring 官方提供的starter 命名规范为 spring-boot-starter-xxx ,第三方提供的starter命名规范为 xxx-spring-boot-starter

这里我们以 RocketMQ 的依赖 rocketmq-spring-boot-starter 来学习 starter的原理。

在项目中引入 rocketmq-spring-boot-starter 之后,实际上就引入了 rocketmq 的一些相关依赖。

rocketmq-spring-boot 中有一个自动装配的类RocketMQAutoConfiguration ,我截取了其中的一小段代码,一起来看看。

@Configuration
@EnableConfigurationProperties(RocketMQProperties.class)
@ConditionalOnClass({MQAdmin.class})
@ConditionalOnProperty(prefix = "rocketmq", value = "name-server", matchIfMissing = true)
@Import({MessageConverterConfiguration.class, ListenerContainerConfiguration.class, ExtProducerResetConfiguration.class, RocketMQTransactionConfiguration.class})
@AutoConfigureAfter({MessageConverterConfiguration.class})
@AutoConfigureBefore({RocketMQTransactionConfiguration.class}) public class RocketMQAutoConfiguration {
private static final Logger log = LoggerFactory.getLogger(RocketMQAutoConfiguration.class); public static final String ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME =
"rocketMQTemplate"; @Autowired
private Environment environment; @Bean(destroyMethod = "destroy")
@ConditionalOnBean(DefaultMQProducer.class)
@ConditionalOnMissingBean(name = ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME)
public RocketMQTemplate rocketMQTemplate(DefaultMQProducer mqProducer,
RocketMQMessageConverter rocketMQMessageConverter) {
RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();
rocketMQTemplate.setProducer(mqProducer);
rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter());
return rocketMQTemplate;
}
}
  • @Configuration 说明这是一个配置类,类中被@Bean注解了的方法,就是spring的一个bean,例如rocketMQTemplate
  • @EnableConfigurationProperties,启用被@ConfigurationProperties的bean,这里引入了 RocketMQProperties

RocketMQProperties 就是需要在yml文件中写入的属性。

@ConfigurationProperties(prefix = "rocketmq")
public class RocketMQProperties { private String nameServer; private String accessChannel; private Producer producer; private Consumer consumer = new Consumer();
}

在Spring Boot项目启动的时候默认只会扫描下级目录下带 @Configuration 注解的类,那么像本文中提到的 RocketMQAutoConfiguration 是如何扫描的呢?其实项目启动的时候会去加载项目中所有的 spring.factories 文件,然后加载对应的配置类,因此我们就需要在 spring.factories 中只指定需要扫描的类。

原理搞明白了,接下来我们就简单实现一个自己的starter!这个starter的主要作用就是给一个对象尾部拼接一个字符串!

一、新建项目

新建一个名为 javatip-spring-boot-starter 的项目,并且引入下面的依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

二、新增配置类

配置类对应的properties文件中的属性为javatip.name

@ConfigurationProperties(prefix = "javatip")
public class JavatipPorperties { private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

三、新增拼接字符串的方法

此方法主要就是为对象拼接一个固定的字符串

public class StrUt {

    private String name;

    public String strTo(Object object){

        return object +"---"+ getName();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

四、新增自动配置类

使用注解 @EnableConfigurationProperties 启用 JavatipProperties 配置类

使用注解 @Configuration 配合 @Bean 注册一个拼接字符串的bean对象。

@Configuration
@EnableConfigurationProperties(JavatipPorperties.class)
public class JavatipAutoConfiguration { @Autowired
private JavatipPorperties javatipPorperties; @Bean
public StrUt strut(){
StrUt strut = new StrUt();
strut.setName(javatipPorperties.getName());
return strut;
}
}

五、新增配置发现文件

在resources文件夹中新建 META-INF 文件夹,在 META-INF 文件夹中新建配置发现文件 spring.factories,并且将自动配置类写到文件里。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.javatip.str.configuration.JavatipAutoConfiguration

六、打包测试

使用 mvn install 命令将项目打包推送到本地maven仓库,然后新建一个测试项目,引入打包好的依赖。

<dependency>
<groupId>com.javatip</groupId>
<artifactId>javatip-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

application.yml 文件中写入自动拼接的字符串对应的属性 javatip.name

javatip:
name: Java旅途

然后手写一个测试类:

@RestController
public class Test { @Autowired
private StrUt strUt; @GetMapping("test")
public String test(){ String str = strUt.strTo("who are you?");
return str;
}
}

运行测试类后,页面返回了

who are you?---Java旅途

这样,一个简单的starter就写好了,只要理解了starter的原理,实现起来就很简单,第一点就是starter相当于一个依赖组,另一点就是starter可以完成初始化配置。

手撸了一个starter,同事直夸我666~的更多相关文章

  1. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!

    罗曼罗兰说过:世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手 ...

  2. 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...

    https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...

  3. 手撸一个SpringBoot-Starter

    1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...

  4. 使用Java Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  5. 【手撸一个ORM】MyOrm的使用说明

    [手撸一个ORM]第一步.约定和实体描述 [手撸一个ORM]第二步.封装实体描述和实体属性描述 [手撸一个ORM]第三步.SQL语句构造器和SqlParameter封装 [手撸一个ORM]第四步.Ex ...

  6. 第二篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 继上一篇使用Flutter开发的抖音国际版 后再次撸一个国内版抖音,大部分功能已完成,主要是Flutter开发APP速度很爽,  先看下图 项目主要结构介绍 这次主要的改动在api.dart 及 ...

  7. 通过 Netty、ZooKeeper 手撸一个 RPC 服务

    说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...

  8. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  9. 以鶸ice为例,手撸一个解释器(一)明确目标

    代码地址 # HelloWorld.ice print("hello, world") 前言(废话) 其实从开始学习编译原理到现在已经有快半年的时间了,但是其间常常不能坚持看下去龙 ...

随机推荐

  1. Debezium实现多数据源迁移(一)

    背景: 某公司有三个数据库,分别为MySql.Oracle和PostgreSql.原有业务的数据都是来自于这三个DB,此处委托将原有的三个数据库整合成一个Mysql. 要求: 1.不影响原有系统的继续 ...

  2. centos系统mysql忘记密码

    安装 mysql 之后,注意添加软连接 mysql 忘记密码操作, vim /etc/my.cnf 在 [mysqld] 的段中加上一句:skip-grant-tables 重启 mysql 服务, ...

  3. HDU_3071 Gcd & Lcm game 【素数分解 + 线段树 + 状压】

    一.题目  Gcd & Lcm game 二.分析 非常好的一题. 首先考虑比较暴力的做法,肯定要按区间进行处理,对于$lcm$和$gcd$可以用标准的公式进行求,但是求$lcm$的时候是肯定 ...

  4. Android Studio 安装并使用genymotion

    一.安装genymotion与VirtualBox 1.安装 genymotion安装包:https://pan.baidu.com/s/1UTwvJv2pbHE4znBw91V19g virtual ...

  5. P1604_B进制星球(JAVA语言)

    思路:BigInteger 五杀!利用BigInteger自带的进制转换. //第一次提交WA了几组数据,下载测试数据发现带字母的答案要转换为大写. 题目背景 进制题目,而且还是个计算器~~ 题目描述 ...

  6. 基于sklearn的波士顿房价预测_线性回归学习笔记

    > 以下内容是我在学习https://blog.csdn.net/mingxiaod/article/details/85938251 教程时遇到不懂的问题自己查询并理解的笔记,由于sklear ...

  7. noip初赛复习总纲

    初赛复习总纲 目录 初赛复习总纲 计算机发展史 计算机的分类 计算机的应用 操作系统盘点 计算机的基本结构 中央处理器(**CPU**--**Central Processing Unit**) 存储 ...

  8. .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...

  9. python基础(四):切片和索引

    Python中的序列有元组.列表和字符串,因此我们都可以通过索引和切片的方式,来获取其中的元素. 索引 Python中的索引,对于正向索引,都是从0开始的.但是对于反向索引,确实从-1开始的.如图所示 ...

  10. 轻松理解 Spring AOP

    目录 Spring AOP 简介 Spring AOP 的基本概念 面向切面编程 AOP 的目的 AOP 术语和流程 术语 流程 五大通知执行顺序 例子 图例 实际的代码 使用 Spring AOP ...