在上一篇文章中,我们已经了解了一个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. Mac上使用ssh连接服务器title显示服务器的ip

    Mac上使用ssh连接服务器title显示服务器的ip 使用Mac开发时,管理的服务器过多时,会搞混乱.可能有时啪啪啪一顿操作,最后发现操作错了机器. 解决方案 在远程服务器上,编辑vim /etc/ ...

  2. Product Backlog:终极任务清单

    健康的Product Backlog就像一个健康的人那样:整洁有序.组织合理.公开透明.一个按照优先级顺序排好的敏捷Backlog不仅能够简化发版和迭代计划,还能够对团队计划去做的所有工作进行细致规划 ...

  3. Python 爬虫从入门到进阶之路(十四)

    之前的文章我们已经可以根据 re 模块,Xpath 模块和 BeautifulSoup4 模块来爬取网站上我们想要的数据并且存储在本地,但是我们并没有对存储数据的格式有要求,本章我们就来看数据的存储格 ...

  4. seo外链发布之论坛外链

    目前最常见的seo外链方式有5种,之前大发迹创业项目网写文章分享过,详情可以查看文章<[网站SEO优化]最常见的五种软文外链发布方式!>,这篇文章不说其他的几种发外链,就来讲讲通过论坛建设 ...

  5. IDEA永久使用

    IDEA永久使用 一.在https://www.cnblogs.com/zyx110/p/10799387.html中下载下面图片中箭头所指的部分 下载完成后双击打开,除了以下图片提示内容,一路下一步 ...

  6. Linux命令学习-cd命令

    Linux中,cd命令的全称是change directory,即改变目录的意思,主要用于切换工作目录到指定目录. 假设当前处于wintest用户的主目录,路径为 /home/wintest ,存在文 ...

  7. Java学习笔记之---集合

    Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...

  8. windows切换mac遇到的问题

    1. 前端代码需要安装npm包 所以需要对整个文件夹都赋予管理员权限 2. 在npm i的时候如果权限不足 查看是哪一行调用了哪个文件夹,赋予权限 3. Dsp-fe 本地环境 除了需要配置host  ...

  9. ~~Python解释器安装教程及环境变量配置~~

    进击のpython Python解释器安装教程以及环境变量配置 对于一个程序员来说,能够自己配置python解释器是最基础的技能 那么问题来了,现在市面上有两种Python版本 Python 2.x ...

  10. break使用不当引发的一个“血案”

    最近在网上冲浪,读到一则新闻,摘抄下这则新闻: ======================= 以下文字摘抄自互联网==================== 1990年1月15日,AT&T电话 ...