在上一篇文章中,我们已经了解了一个starter实现自动配置的基本流程,在这一小结我们将复现上一过程,实现一个自定义的starter。

先来分析starter的需求:

  • 在项目中添加自定义的starter依赖,自动在Spring中加载starter中的Bean;
  • 从application.properties中加载指定配置

创建项目

  1. 先创建一个名为starter的项目。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>top.ninwoo</groupId>
<artifactId>demo-starter</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
</dependencies>
</project>
  1. 在resources中创建一个META-INF的目录,并在目录中创建一个spring.factories。在这个配置中,我们只设置一个EnableAutoConfiguration项,并且对应只设置一个DemoAutoConfig配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=top.ninwoo.config.DemoAutoConfig
  1. 创建DemoAutoConfig配置类

    package top.ninwoo.config;
    
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration; @Configuration
    @EnableConfigurationProperties(DemoStarterProperties.class)
    public class DemoAutoConfig { @Bean
    DemoBean demoBean() {
    return new DemoBean();
    }
    }

    这个配置类,我们主要使用了@Configuration和@EnableConfigurationProperties两个注解。@EnableConfigurationProperties启用一个ConfigurationProperties。

  2. 创建ConfigurationProperties对应的DemoStarterProperties

    package top.ninwoo.config;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "top.ninwoo.demo")
    public class DemoStarterProperties { private String name = "default";
    private int age = 0; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public int getAge() {
    return age;
    } public void setAge(int age) {
    this.age = age;
    }
    }

    创建一个ConfigurationProperties类。这个类主要用来从application.properties中读取配置项,并自动设置到相对应的字段上。

  3. 创建一个测试用Bean,并使用ConfigurationProperties类中的信息。

    起初这里有个疑惑,不知道如何使用这个ConfigurationProperties类。不过在spring中最常见的就是Bean,我们可以大胆的猜测通过@ConfigurationProperties注释的类,将自动在Spring容器中自动创建一个Bean。而我们在使用的时候,就通过普通的bean注入方式便可以使用ConfigurationProperties类中的信息。所以,我们这样创建一个测试Bean

    package top.ninwoo;
    
    import javax.annotation.Resource;
    
    public class DemoBean {
    @Resource
    DemoStarterProperties properties; public String getName() {
    return properties.getName();
    } public String getAge() {
    return getAge();
    }
    }

    同时在DemoAutoConfig中使用@Bean注解创建一个Bean。

到这里,我们的starter就创建完成了。通过mvn打包,或者创建同一个父项目的不同子Module的方式,我们可以进行测试这个starter是否生效。

创建测试类

测试类使用一个spring boot web项目来完成,主要创建了一个RestController,并通过RestController获取Spring上下文中注册的bean names和starter中的测试Bean。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>top.ninwoo</groupId>
<artifactId>springboot-demo</artifactId>
<version>1.0.0</version> <parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.1.6.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>top.ninwoo</groupId>
<artifactId>demo-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

在pom文件中,我们添加了刚刚实现的starter。

RestController:

@RestController
public class IndexController implements ApplicationContextAware { ApplicationContext ctx = null; @Resource
DemoBean demoBean; @RequestMapping("/getList")
public String[] getBeanNames() {
return ctx.getBeanDefinitionNames();
} @RequestMapping("/getDemoBean")
public String demoBean() {
return demoBean.getName();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
}

SpringBoot启动类 MainApp:

package top.ninwoo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class MainApp { public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
}

我们可以看到,与正常的一个web项目相比,我们只是添加了一个依赖,而并没有修改启动类。

测试

访问127.0.0.1:8080/getList接口,我们可以看到最后的几个bean Names是:

...,"top.ninwoo.config.DemoAutoConfig","demoBean","top.ninwoo.demo-top.ninwoo.config.DemoStarterProperties"]

这证明,通过注入我们starter依赖,已经在Spring的上下文创建了starter配置类中的Bean。

在没有设置application.properties时,直接访问http://127.0.0.1:8080/getDemoBean,可以获取到测试用的Bean实例中默认的参数配置default.

添加application.properties:

top.ninwoo.demo.name=joliu

重启项目,再次访问该接口,发现测试用的Bean实例对应的属性已经安装配置类中的参数进行设置,返回了joliu。

小结

到这里,我们可以说已经了解了开发一个SpringBoot Starter最基本的流程,我们可以尝试在我们日常的项目中开发这样的starter。

开发一个Spring Boot Starter!的更多相关文章

  1. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  2. 自己写一个spring boot starter

    https://blog.csdn.net/liuchuanhong1/article/details/55057135

  3. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  4. 创建自己的Spring Boot Starter

    抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...

  5. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

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

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

  7. 一个简单易上手的短信服务Spring Boot Starter

    前言 短信服务在用户注册.登录.找回密码等相关操作中,可以让用户使用更加便捷,越来越多的公司都采用短信验证的方式让用户进行操作,从而提高用户的实用性. Spring Boot Starter 由于 S ...

  8. Spring Boot Starter 开发指南

    Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...

  9. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

随机推荐

  1. 深度探索c++对象模型 第一章

    1,声明与定义. //声明式如下: extern int x;   //对象式(变量式)声明 std::size_t numDigits(int number);  //函数式声明 class Wid ...

  2. HDU 1724:Ellipse(自适应辛普森积分)

    题目链接 题意 给出一个椭圆,问一个[l, r] 区间(蓝色区域)的面积是多少. 思路 自适应辛普森积分 具体一些分析如上. 很方便,套上公式就可以用了. 注意 eps 的取值影响了跑的时间,因为决定 ...

  3. Tensorflow教程(2)Tensorflow的常用函数介绍

    1.tf.constant tf.constant用来定义一个常量,所谓常量,广义上讲就是“不变化的量”.我们先看下官方api是如何对constant函数来定义的: tf.constant( valu ...

  4. c++学习书籍推荐《The C++ Programming Language第四版》下载

    百度云及其他网盘下载地址:点我 作者简介 Bjarne Stroustrup is the designer and original implementer of C++, the author o ...

  5. idea环境下push项目

    1,选中需要推送的项目: 2,VCS-git-add 添加到本地仓库 3,vcs-commit 提交 4.commit and push 推送到远程仓库 出现错误这是提示程序有错误或者是TODO代码没 ...

  6. Excel中vlookup函数使用

    https://baijiahao.baidu.com/s?id=1594684818733205984&wfr=spider&for=pc

  7. Unity《ATD》塔防RPG类3D游戏架构设计(二)

    目录 <ATD> 游戏模型 <ATD> 游戏逻辑 <ATD> UI/HUD/特效/音乐 结语 前篇:Unity<ATD>塔防RPG类3D游戏架构设计(一 ...

  8. NOIP最后阶段每日小记

    前言:最后几天了,记录一下每天的经验.教训.启示.大牛路过请补充一点内容…… 2017-10-31 21:32 今天考试打完第一题就知道是AK场,然后就死命搞题,结果第一题手贱多打了一个%,本机无显示 ...

  9. LINUX安装源码软件经典三部曲

    这几天一直在搞suse下的mplyaer.ffmpeg等源码编译安装,总结出源码软件安装三部曲,网上称为经典三部曲. 这三步分别为: 1. ./configure [options] 2. make ...

  10. ISTQB名词辨析

    测试规程说明(Test Procedure Specification) 规定了执行测试的一系列行为的文档,也称为测试脚本或测试剧本.