从上一篇文章《深入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. JavaSE Lambda表达式(JDK1.8新特性)

    在前面有一篇写到了Lambda表达式,现在可以给你们介绍什么是Lambda表达式 现在有很多老程序员都不喜欢这个函数式编程思想 主要就一点 : 老程序员习惯了 面向过程 写程序,而Lambda表达式是 ...

  2. Spring容器的创建刷新过程

    Spring容器的创建刷新过程 以AnnotionConfigApplicationContext为例,在new一个AnnotionConfigApplicationContext的时候,其构造函数内 ...

  3. 【读书笔记】iOS-iOS敏捷开发

    敏捷开发分为几个不同的门派,如:Scrum,XBreed,极限编程(XP Extreme Programming)和水晶方法等. 参考资料:<iOS传感器应用开发最佳实践>  

  4. vue-cli脚手架目录一览

    最近在学习vue,看的稀里糊涂.今天从头开始,把cli配置的vue项目目录和配置文件搞清楚. 先看看整个项目目录结构: 再看看build文件夹下相关文件及目录: config文件夹下目录和文件: 接下 ...

  5. CSS--理解块级格式上下文(BFC)

    1.BFC 定义 BFC(Block formatting context)直译为"块级格式化上下文".它是一个独立的渲染区域,只有Block-level box(块级元素)参与, ...

  6. U8 应付款管理 单据类型 分析

    Ap_CloseBill   收付款单主表 Ap_CloseBills 收付款单子表 cVouchType 在收付款单主表中  ,用于区分单据为收款单还是付款单(48,49)  49:付款单 48:收 ...

  7. EventBus结合rxjava2和retrofit2网络获取

    依赖: compile 'com.squareup.retrofit2:converter-gson:2.3.0'compile 'com.squareup.retrofit2:retrofit:2. ...

  8. go 实现简单的加权分配

    最近一段时间接手了一个golang编写的模块,从python转到golang这种静态语言还是有些不适应的,接手模块后的第一个需求是实现一个加权分配的方法. 简单来说数据库中存有3个链接,3个链接的权重 ...

  9. C#异常--System.IO.FileLoadException:“混合模式程序集是针对“v2.0.50727”版的运行时生成的错误

    异常信息: System.IO.FileLoadException:“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.” ...

  10. 解决pycharm下代码报错的问题

    file-----settings------project:Pythonstudy------project structure-----选择要导入的文件并点击OK