从上一篇文章《深入springboot原理——一步步分析springboot启动机制(starter机制)

我们已经知道springboot的起步依赖与自动配置的机制。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。starter.jar提供jar引入,autoconfigure.jar实现自动配置。下面我们就来封装一个自己的starter。

准备要封装的组件

新建组件com-itpsc-service,组件只有一个service。

pom文件

<groupId>com.itpsc</groupId>
<artifactId>com-itpsc-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>com-itpsc-service</name>
<description>com-itpsc-service</description>

编写UserService类

public class UserService {
private String username;
private String password; public void print() {
System.out.println("username="+username + " password="+password);
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

打包发布组件

idea终端里面输入命令mvn install package打包到maven仓库。

新建一个starter

新建一个名称为itpsc-spring-boot-starter启动组件

引入spring-boot-starter、spring-boot-autoconfigure、spring-boot-configuration-processor

这些Jar在编写自动配置类、注解、生成配置元数据处理等功能依赖的jar包。

<groupId>com.itpsc.spring.boot</groupId>
<artifactId>itpsc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.itpsc</groupId>
<artifactId>com.itpsc.service</artifactId>
</dependency>
</dependencies

编写自动配置类

UserProperties.java,使用@ConfigurationProperties注解将配置文件(yml/properties)中指定前缀的配置转为bean。

package com.itpsc.spring.boot.starter;
...
@ConfigurationProperties(prefix = "com.itpsc")
public class UserProperties {
private String username;
private String password;
...
}

UserAutoConfiguration.java,@Configuration 注释使类成为bean的工厂。

@EnableConfigurationProperties注解使@ConfigurationProperties注解生效。

package com.itpsc.spring.boot.starter;
...
@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfiguration { @Bean
public UserService getBean(UserProperties userProperties) {
//创建组件实例
UserService userService = new UserService();
userService.setUsername(userProperties.getUsername());
userService.setPassword(userProperties.getPassword());
return userService;
}
}

配置spring.factories文件

\META-INF\spring.factories该文件用来定义需要自动配置的类,springboot启动时会进行对象的实例化,会通过加载类SpringFactoriesLoader加载该配置文件,将文件中的配置类加载到spring容器。

在src/main/resources新建META-INF文件夹,在META-INF文件夹下新建spring.factories文件。配置内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.itpsc.spring.boot.starter.UserAutoConfiguration

打包发布starter

idea终端里面输入命令mvn install package打包到maven仓库。

测试starter

我们在springboot-mybatis-demo项目中引入starter

<dependency>
<groupId>com.itpsc.spring.boot</groupId>
<artifactId>itpsc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

当在yml中配置username、password时就可以看到有自动提示了,这是因为引入的jar中包含了元数据文件,详细见下文。

com:
itpsc:
username: "itpsc"
password: itpsc@123

元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。

测试在增加一个测试方法

@Autowired
private UserService userService; @Test
public void testItpscStarter() {
userService.print();
}

运行结果:

2019-01-23 20:22:41.615  INFO 17184 --- [           main] .i.SpringbootMybatisDemoApplicationTests : Started SpringbootMybatisDemoApplicationTests in 11.505 seconds (JVM running for 14.582)
username=itpsc password=itpsc@123

从运行结果可以看出,我们封装的starter中的jar包的bean已经完成了自动配置,说明我们的starter封装成功了。下面补充下上文提到的元数据相关知识。

元数据

springboot jar包含元数据文件,提供所有支持的配置属性的详细信息。这些文件旨在允许IDE开发人员在用户使用application.properties 或application.yml文件时提供上下文帮助和自动补全 。

主要的元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。

配置元数据位于jar文件中的META-INF/spring-configuration-metadata.json,它们使用一个具有”groups”或”properties”分类节点的简单JSON格式。

{
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
"defaultValue": 8080,
"name": "server.port",
"description": "Server HTTP port.",
"type": "java.lang.Integer"
},
{
"defaultValue": "\/",
"deprecated": true,
"name": "server.servlet-path",
"description": "Path of the main dispatcher servlet.",
"type": "java.lang.String",
"deprecation": {
"level": "error",
"replacement": "server.servlet.path"
}

这两个json节点server.port、server.servlet-path对应可以在yml或者properties文件中定义

server:
port: 8081
context-path: /

如果不知道spring是否支持某个配置的话,可以查看元数据文件看是否有对应的节点。

深入springboot原理——动手封装一个starter的更多相关文章

  1. springboot2.x基础教程:动手制作一个starter包

    上一篇博客介绍了springboot自动装配的原理.springboot本身有丰富的spring-boot-starter-xx集成组件,这一篇趁热打铁加深理解,我们利用springboot自动装配的 ...

  2. springBoot 自动配置原理--自己新建一个 starter

    上篇我们说到 springboot 和 SSM 框架的区别,今天我们就看看 springboot 到底为我们做了哪些事情,让我们开发变得如此简单. springboot 中起着重要作用的是 start ...

  3. 【JavaScript框架封装】自己动手封装一个涵盖JQuery基本功能的框架及核心源码分享(单文件版本)

    整个封装过程及阅读JQuery源码的过程基本上持续了一个月吧,最终实现了一个大概30%的JQuery功能的框架版本,但是里面涉及的知识点也是非常多的,总共的代码加上相关的注释大概在3000行左右吧,但 ...

  4. 自己动手封装一个url参数解释器( ghostWuUrlParser.js )

    ghostWuUrlParser.js的作用是分析一段url中的查询参数,即: '?'号后面的 键值对参数. ghostWuUrlParser.js 使用说明: ghostWuUrlParser( ' ...

  5. SpringBoot内置的各种Starter是怎样构建的?--SpringBoot源码(六)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五) 温 ...

  6. Spring-boot原理(附带实现一个spring-boot-starter实例和代码下载)

    ​ (我就是个封面) Spring-boot自出现后,到现在火的很,大家貌似都在用,连招聘里面也要求会这个.但是说实话,spring-boot无外乎想实现一种可插拔的编程方式,说是简化配置,其实并没有 ...

  7. 自己动手写一个服务网关-java

    自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...

  8. Spring Security(五) —— 动手实现一个 IP_Login

    摘要: 原创出处 https://www.cnkirito.moe/spring-security-5/ 「老徐」欢迎转载,保留摘要,谢谢! 5 动手实现一个IP_Login 在开始这篇文章之前,我们 ...

  9. Springboot原理

    1. SpringBoot特点 一个starter导入所有 依赖管理 父项目做依赖管理:声明了所需依赖的版本号 依赖管理 <parent> <groupId>org.sprin ...

随机推荐

  1. T-SQL:排除阻塞(十六)

    当一个事务持有事务的资源锁,并且另一个事务请求同一资源的不兼容锁时,请求被阻塞并且请求者进入等待状态,直到锁定者释放干扰锁. 长时间运行事务会导致锁被长时间持有,所以只对要开启事务的表操作代码开启事务 ...

  2. spring事务传播行为之使用REQUIRES_NEW不回滚

    最近写spring事务时用到REQUIRES_NEW遇到一些不回滚的问题,所以就记录一下. 场景1:在一个服务层里面方法1和方法2都加上事务,其中方法二设置上propagation=Propagati ...

  3. 【Redis】4、Redis学习资料

    Redis 集群规范 http://www.redis.cn/topics/cluster-spec.html Redis 集群教程 http://www.redis.cn/topics/cluste ...

  4. ELK日志分析平台系统windows环境搭建和基本使用

    ELK(ElasticSearch, Logstash, Kibana),三者组合在一起就可以搭建实时的日志分析平台啦! Logstash主要用来收集.过滤日志信息并将其存储,所以主要用来提供信息. ...

  5. Flask的Context(上下文)学习笔记

    上下文是一种属性的有序序列,为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等. 比如在计算机中,相对于进程而言,上下文就是进 ...

  6. idea vue.js插件安装

    Vue.js for IntelliJ IDEA-based IDEs This plugin provides support for Vue.js in IntelliJ IDEA Ultimat ...

  7. form的重置reset

    HTML中Form表单的reset方法被用来重置用户所输入的内容,以前一直误以为其是单纯的将input等输入项中的值清空. 但实际上不是这样的,reset方法的本质是将input等输入项中的内容还原为 ...

  8. 网络基础 cookie详解

    cookie详解 by:授客 QQ:1033553122 cookie干嘛用的? 参见文章http 会话(session)详解: 网络基础 http 会话(session)详解   cookie分类 ...

  9. 《Inside C#》笔记(八) 接口

    接口可以认为是属于不同继承树的代码之间的行为约定.C#的接口相当于是一种特殊的抽象类,这种抽象类的内部只有虚方法. 一 接口的使用 a) 接口内部可以包含方法.属性.索引器和事件,这些成员都不在接口中 ...

  10. 一种快速部署开发用oracle的办法

    前段时间工作中需要在不少开发环境中快速提供开发可用的oracle环境,由于一一培训并部署原生oracle人力和时间成本过高,后来使用docker版本oracle,大大方便了开发工作的快速启动,方法记录 ...