来源:阿杜的世界

号外:最近整理了一下以前编写的一系列Spring Boot内容,整了个《Spring Boot基础教程》的PDF,关注我,回复:001,快来领取吧~!更多内容持续整理中,帮助大家更好的学习Spring相关的系列内容!

在学习Spring Boot的过程中,接触最多的就是starter。可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boot自动通过classpath路径下的类发现需要的Bean,并织入bean。举个例子,spring-boot-starter-jdbc这个starter的存在,使得我们只需要在BookPubApplication下用 @Autowired引入DataSource的bean就可以,Spring Boot会自动创建DataSource的实例。

这里我们会用一个不太规范的starter展示Spring Boot的自动配置的运行原理。Spring Boot的自动配置、Command-line Runner一文中曾利用StartupRunner类在程序运行启动后首先查询数据库中书的数目,现在换个需求:在系统启动后打印各个实体的数量。

How Do

  • 新建一个模块db-count-starter,然后修改db-count-starter模块下的pom文件,增加对应的库。

  1. <dependencies>

  2.    <dependency>

  3.        <groupId>org.springframework.boot</groupId>

  4.        <artifactId>spring-boot</artifactId>

  5.        <!-- version继承父模块的-->

  6.    </dependency>

  7.    <dependency>

  8.        <groupId>org.springframework.data</groupId>

  9.        <artifactId>spring-data-commons</artifactId>

  10.        <version>1.9.3.RELEASE</version>

  11.    </dependency>

  12. </dependencies>

  • 新建包结构com/test/bookpubstarter/dbcount,然后新建DbCountRunner类,实现CommandLineRunner接口,在run方法中输出每个实体的数量。

  1. package com.test.bookpubstarter.dbcount;

  2. import org.slf4j.Logger;

  3. import org.slf4j.LoggerFactory;

  4. import org.springframework.boot.CommandLineRunner;

  5. import org.springframework.data.repository.CrudRepository;

  6. import java.util.Collection;

  7. public class DbCountRunner implements CommandLineRunner {

  8.    protected final Logger logger = LoggerFactory.getLogger(DbCountRunner.class);

  9.    private Collection<CrudRepository> repositories;

  10.    public DbCountRunner(Collection<CrudRepository> repositories) {

  11.        this.repositories = repositories;

  12.    }

  13.    @Override

  14.    public void run(String... strings) throws Exception {

  15.        repositories.forEach(crudRepository -> {

  16.            logger.info(String.format("%s has %s entries",

  17.                    getRepositoryName(crudRepository.getClass()),

  18.                    crudRepository.count()));

  19.        });

  20.    }

  21.    private static String getRepositoryName(Class crudRepositoryClass) {

  22.        for (Class repositoryInterface : crudRepositoryClass.getInterfaces()) {

  23.            if (repositoryInterface.getName().startsWith("com.test.bookpub.repository")) {

  24.                return repositoryInterface.getSimpleName();

  25.            }

  26.        }

  27.        return "UnknownRepository";

  28.    }

  29. }

  • 增加自动配置文件DbCountAutoConfiguration

  1. package com.test.bookpubstarter.dbcount;

  2. import org.springframework.context.annotation.Bean;

  3. import org.springframework.context.annotation.Configuration;

  4. import org.springframework.data.repository.CrudRepository;

  5. import java.util.Collection;

  6. @Configuration

  7. public class DbCountAutoConfiguration {

  8.    @Bean

  9.    public DbCountRunner dbCountRunner(Collection<CrudRepository> repositories) {

  10.        return new DbCountRunner(repositories);

  11.    }

  12. }

  • 在src/main/resources目录下新建META-INF文件夹,然后新建spring.factories文件,这个文件用于告诉Spring Boot去找指定的自动配置文件,因此它的内容是

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

  2. com.test.bookpubstarter.dbcount.DbCountAutoConfiguration

  • 在之前的程序基础上,在顶层pom文件中增加starter的依赖

  1. <dependency>

  2.   <groupId>com.test</groupId>

  3.   <artifactId>db-count-starter</artifactId>

  4.   <version>0.0.1-SNAPSHOT</version>

  5. </dependency>

  • 把StartupRunner相关的注释掉,然后在main函数上右键Run BookPubApplication.main(...),可以看出我们编写的starter被主程序使用了。

分析

正规的starter是一个独立的工程,然后在maven中新仓库注册发布,其他开发人员就可以使用你的starter了。

常见的starter会包括下面几个方面的内容:

  1. 自动配置文件,根据classpath是否存在指定的类来决定是否要执行该功能的自动配置。

  2. spring.factories,非常重要,指导Spring Boot找到指定的自动配置文件。

  3. endpoint:可以理解为一个admin,包含对服务的描述、界面、交互(业务信息的查询)

  4. health indicator:该starter提供的服务的健康指标

在应用程序启动过程中,Spring Boot使用SpringFactoriesLoader类加载器查找org.springframework.boot.autoconfigure.EnableAutoConfiguration关键字对应的Java配置文件。Spring Boot会遍历在各个jar包种META-INF目录下的spring.factories文件,构建成一个配置文件链表。除了EnableAutoConfiguration关键字对应的配置文件,还有其他类型的配置文件:

  • org.springframework.context.ApplicationContextInitializer

  • org.springframework.context.ApplicationListener

  • org.springframework.boot.SpringApplicationRunListener

  • org.springframework.boot.env.PropertySourceLoader

  • org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider

  • org.springframework.test.contex.TestExecutionListener

Spring Boot的starter在编译时不需要依赖Spring Boot的库。这个例子中依赖spring boot并不是因为自动配置要用spring boot,而仅仅是因为需要实现CommandLineRunner接口。

两个需要注意的点

  1. @ConditionalOnMissingBean的作用是:只有对应的ban在系统中都没有被创建,它修饰的初始化代码块才会执行,用户自己手动创建的bean优先

  2. Spring Boot starter如何找到自动配置文件(xxxxAutoConfiguration之类的文件)?

  • spring.factories:由Spring Boot触发探测classpath目录下的类,进行自动配置;

  • @Enable:有时需要由starter的用户触发*查找自动配置文件的过程。

热门推荐:

是什么使你留在你的公司

从业务到平台的思维转变

·END·

 近期热文:

  • Spring Cloud Stream 学习小清单

  • 从业务到平台的思维转变

  • 是什么使你留在你的公司

  • 重磅!Github 开放无数量限制的免费私有仓库!

  • 百度面试题:求数组最大值

  • 我说分布式事务之消息最终一致性事务(一):原理及实现

  • 疑案追踪:Spring Boot内存泄露排查记

  • 了解Java中的内存泄漏

  • Git 常用命令清单,掌握这些,轻松驾驭版本管理

  • 优先级队列(头条面试题)

  • 来谈下高并发和分布式中的幂等处理

  • 你应该知道的7个写出更好的 Java 代码的技巧

看完,赶紧点个“好看”鸭

点鸭点鸭

↓↓↓↓

Spring Boot:自定义starter相关推荐

  1. Spring Boot : 自定义 Starter

    1.美图 2.概述 因为spring boot 已经自定义了很多starter,但是任然不能涵盖所有的开发场景,所以有时候就需要我们自己自定义starter. 自定义starter需要思考的问题 : ...

  2. Spring Boot自定义横幅生成

    每当我们启动Spring Boot应用程序时,都会显示如下所示的文本消息. 这称为横幅. 现在,如果我们可以创建一个特定于我们的Spring Boot应用程序的自定义横幅并使用它代替默认的Spring ...

  3. Spring Boot(3)---Spring Boot启动器Starter详解

    Spring Boot的启动器Starter详解 Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用, Spring Boot 管理 Spring 容器.第 ...

  4. Spring Boot自定义Banner

    Spring Boot自定义Banner https://www.jianshu.com/p/a53f324c92f2 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Log ...

  5. Spring Boot自定义启动Banner

    Spring Boot自定义启动Banner 生成工具 https://www.bootschool.net/ascii

  6. 八、Spring Boot自定义starters

    一.自定义starters • 自动装配Bean: – 自动装配使用配置类(@Configuration)结合Spring4 提供的条件判断注解 @Conditional及Spring Boot的派生 ...

  7. Spring Boot自定义starters

    starter: 这个场景需要使用到的依赖是什么? 如何编写自动配置 /*** 以WebMvcAutoConfiguration为例*///指定这个类是一个配置类 @Configuration(pro ...

  8. Spring Boot自定义 Servlet Filter 的两种方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 针 ...

  9. Spring Boot中Starter是什么

    比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依 ...

  10. Spring Boot——自定义Web配置类后无法访问/static文件夹下静态资源

    问题描述 自定义Web配置类后无法访问 /static文件夹下静态资源. 已加相关依赖包. 官方文档 Spring MVC Auto Configuration Maven <dependenc ...

最新文章

  1. matlab缩小矩阵尺寸,Matlab中对矩阵使用矩阵尺寸的索引
  2. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 4 Face Recognition for the Happy House
  3. 关于asp.net2.0资源文件本地化多语言版本的一些小技巧
  4. CImage类显示图片
  5. net start zabbix agent 服务没有相应控制功能_一步到位,服务器监控就是这么简单...
  6. Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用
  7. BBE Sound Sonic Sweet(激励混音效果器)v4.2.0 绿色版
  8. 开源漏洞扫描工具(OWASP-Dependency-Check)探索
  9. Mybatis面试题-日更
  10. (127)FPGA面试题-介绍FPGA 门控时钟
  11. tempdb SQL Server系统数据库的配置,操作和限制
  12. rust笔记9 错误处理
  13. 【软考】系统集成项目管理工程师(一)信息化知识
  14. checkbox不全部选中,会跳出提示(这个是我记录的重点)
  15. Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe did not run properly!
  16. 【python实战】怎么用python自动登录CSDN
  17. 极域电子教室学生机房管理助手(好好上课)教程
  18. windows操作系统基础总结
  19. 如何用html5实现网页聊天,HTML5 WebSocket实现点对点聊天的示例代码
  20. CTF.show:新春红包题wp

热门文章

  1. docker 逃逸 简介
  2. python3 使用psutil 查看内存占用
  3. jenkins rec 分析 cve-2018-1000861 分析
  4. linux c pid获取进程名 进程名获取pid
  5. linux mmap内存文件映射
  6. 从零开始编译自己的Linux发行版 LFS简介
  7. 在VS2010平台上创建并使用dll
  8. 在CMD窗口连接到Mysql
  9. Debian 新维护人员手册
  10. 计算机专业申请计算生物学,卡内基梅隆大学计算生物学硕士专业