什么是springboot starter

starter是springBoot的一个重要部分。通过starter,我们能够快速的引入一个功能,而无需额外的配置。同时starter一般还会给我提供预留的自定配置选项,我们只需要在application.properties中设置相关参数,就可以实现配置的个性化。

那么这些方便的操作是怎么实现的呢?通过了解其原理,我们也可以做一个自己的starter,来让别人快速使用我们的功能。

按个人理解,我认为springBoot Starter就是一个智能化的配置类@Configuration

接下来介绍内容包括:

  • 快速写一个starter demo。
  • 解释其中的原理。

一、快速写一个starter模块试试

1、【创建module】,首先我们自定义一个starter的module,根据你的starter实现复杂度,引入相关spring组件。最基本的,我们只需引入spring-boot-autoconfigure模块。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.linjianhui.springboot</groupId>
<artifactId>examplestarter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
<name>examplestarter</name>
<description>Demo project for Spring Boot starter</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
</dependencies>
</project>

2、【业务bean实现】实现我们的业务bean,案例中我们实现最简单的sayHello服务,输入msg,返回“hello,{msg}”。

public class DemoHelloService {
private String defaultMsg = ""; public String sayHello(String msg) {
return "hello, " + ((msg == null || msg.isEmpty()) ? defaultMsg : msg);
} public void setDefaultMsg(String defaultMsg) {
this.defaultMsg = defaultMsg;
}
}

3、然后就是Configuration类的创建,这个类是starter自动初始化的核心类,负责把业务相关的bean智能的加载进来。

@Configuration
@ConditionalOnClass(DemoHelloService.class)
public class HelloDemoAutoConfiguration {
@Bean
@ConditionalOnMissingBean(DemoHelloService.class)//如果用户未自定义相关bean,生成默认bean
public DemoHelloService demoHelloService() {
DemoHelloService demoHelloService = new DemoHelloService();
return demoHelloService;
}
}

4、配置spring.factories,通过该配置,才能让springboot来自动加载我们的Configuration类。具体原理我们稍后深入了解。

具体的,是在模块的resources/META-INF 目录下,新建spring.factories文件。内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxx.springboot.examplestarter.HelloDemoAutoConfiguration

最后我们把上述模块单独执行以下install或者deploy,一个starter就做好了。

其他项目使用我们的starter就非常简单了:(1)引入starter依赖;(2)注入需要的service。

    <dependencies>
。。。
<dependency>
<groupId>com.xxx.springboot</groupId>
<artifactId>examplestarter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
。。。
@RestController
public class GreetingController {
@Resource
private DemoHelloService demoHelloService; @RequestMapping("/sayhello")
public String sayHello(String msg) {
return demoHelloService.sayHello(msg);
}

done!

二、starter原理解读

回头再看上边的开发流程,有两个地方需要我们了解一下:

(1)如何让starter被自动识别加载:spring.factories里的EnableAutoConfiguration原理。

(2)如何实现自动加载的智能化、可配置化:@Configuration配置类里注解。

1.配置类自动加载机制

这里我们只简单的说一下大致的原理和流程,执行细节大家可以按照文章给出的思路自己去研读。

在SpringBoot的启动类,我们都会加上@SpringBootApplication注解。这个注解默认会引入@EnableAutoConfiguration注解。然后@EnableAutoConfiguration@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector.class的selectImports方法最终会通过SpringFactoriesLoader.loadFactoryNames,加载META-INF/spring.factories里的EnableAutoConfiguration配置值,也就是我们上文中设置的资源文件。

2.自动加载的智能化可配置化

实际使用中,我们并不总是希望使用默认配置。比如有时候我想自己配置相关功能,有时候我想更改一下默认的服务参数。这些常见的场景Starter都想到了,并提供了如下的解决方案:

(1)@Conditional*注解

springboot starter提供了一系列的@Conditional*注解,代表什么时候启用对应的配置,具体的可以去查看一下springboot的官方文档。

比如我们案例中的 「@ConditionalOnClass(DemoHelloService.class)」,代表如果存在DemoHelloService类时,配置类才会生效;又比如「@ConditionalOnMissingBean(DemoHelloService.class)」,代表着如果项目中没有DemoHelloService类型的bean,那么该配置类会自动创建出starter默认的DemoHelloService类型bean。

(2)@ConfigurationProperties注解

这个注解主要是为了解决如下场景:我想要使用starter的默认配置类,但是又想对配置中的某些参数进行自定义配置。@ConfigurationProperties类就是做这个工作的。例如上述例子中,我想对默认的defaultMsg做些个性化的设置。就可以按如下方式来实现:

starter新增ConfigurationProperties类bean

@ConfigurationProperties(prefix = "hello.demo")
public class HelloDemoProperties {
private String defaultMsg = ""; public String getDefaultMsg() {
return defaultMsg;
} public void setDefaultMsg(String defaultMsg) {
this.defaultMsg = defaultMsg;
}
}

启用property

在实际项目中自定义默认msg

当我们不输入msg值时,默认表现行为如下:

 

springboot starter 原理解析及实践的更多相关文章

  1. Tengine HTTPS原理解析、实践与调试【转】

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  2. springboot启动原理解析

    springboot核心原理: 1.基于springmvc无配置文件完全注解化 + 内置web容器实现springboot框架.main函数方式的启动 2.通过maven快速整合第三方框架 sprin ...

  3. SpringBoot日志原理解析

    1.日志框架 小张:开发一个大型系统:1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行时信息:日志框架 : ...

  4. 【大量干货】史上最完整的Tengine HTTPS原理解析、实践与调试

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  5. React 服务器渲染原理解析与实践

    第1章 服务器端渲染基础本章主要讲解客户端与服务器端渲染的概念,分析客户端渲染和服务器端渲染的利弊,带大家对服务器端渲染有一个粗浅认识. 1-1 课程导学1-2 什么是服务器端渲染1-3 什么是客户端 ...

  6. SpringBoot Starter机制 - 自定义Starter

    目录 前言 1.起源 2.SpringBoot Starter 原理 3.自定义 Starter 3.1 创建 Starter 3.2 测试自定义 Starter 前言         最近在学习Sp ...

  7. SpringBoot自定义starter开发分布式任务调度实践

    概述 需求 在前面的博客<Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战>中,我们已经熟悉ElasticJob分布式任务的应用,其核心实现为elasticjob- ...

  8. SpringBoot启动原理及相关流程

    一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...

  9. Spring Boot干货系列:(三)启动原理解析

    Spring Boot干货系列:(三)启动原理解析 2017-03-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说 ...

  10. Spring Boot启动原理解析

    Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置 ...

随机推荐

  1. 2.13 新手必读的Linux使用注意事项

    通过安装并体验 Linux 系统,读者应该能发现 Linux 与 Windows 的一些不同之处,本节就几个容易让初学者混淆的问题做重点讲解,以便加深读者对 Linux 系统的认识. Linux 严格 ...

  2. Excel 导入解析数据 NPOIExcelHelper

    前端代码 html <link href="~/lib/bootstrap-fileinput/css/fileinput.min.css" media="all& ...

  3. Python网络爬虫之requests模块1

    Python网络爬虫之requests模块(1) 引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包 ...

  4. MySQL原理简介—8.MySQL并发事务处理

    大纲 1.简单总结增删改SQL语句的实现原理 2.多个事务同时执行的场景遇到的问题 3.多个事务并发更新或查询时可能出现的问题 4.SQL标准中对事务的4个隔离级别 5.MySQL是如何支持4种事务隔 ...

  5. 设置 crossdomain.xml 文件实施 HTTP 流式传输

    本文概括介绍了跨域策略文件,以及如何在 Adobe Media Server 中为 HTTP 流式传输配置该文件. 为什么需要采用 crossdomain.xml 文件? 跨域策略文件 跨域策略文件是 ...

  6. JDK中的动态代理

    江苏 无锡 缪小东 写到代理模式这章,不得不提到JDK中的动态代理,它是java语言自身对动态代理的支持,类似于JDK中在java.util包中提供Observable类和Observer接口提供对观 ...

  7. 关于XML文档和JAVA中的JTree之间如何转换的问题

    关于XML文档和JAVA中的JTree之间如何转换的问题 XML因为良好的结构,被广泛地应用于文档格式的定义.我们知道,应用软件一般需要用配置文件来决定运行时的一些 参数.以前的应用程序的配置文件一般 ...

  8. 使用IDEA一键发布应用

    1.编辑Dockerfile from java:8 WORKDIR /usr/local ADD ./target/jpaas-bpm.jar . CMD ["java",&qu ...

  9. Numpy本征值求解

    技术背景 Numpy是一个Python库中最经常被用于执行计算任务的一个包,得益于其相比默认列表的高性能表现,以及易用性和可靠性,深受广大Python开发者的喜爱.这里介绍的是使用Numpy计算矩阵本 ...

  10. 强网杯2023 谍影重重2.0 wp

    题目描述 小明是某间谍组织的一员,他终日监听着我国某重点军事基地的飞行动态,妄图通过分析参数找到我国飞的最快的飞机.我国费尽千辛万苦抓住了他,并在他的电脑上找到了一段他监听的信息,请分析出这段信息中飞 ...