前言

一、Spring Boo Starter 简介

在 SpringBoot 出现之前,如果我们想使用 SpringMVC 来构建我们的 web 项目,必须要做的几件事情如下:

  • 首先项目中需要引入 SpringMVC 的依赖
  • 在 web.xml 中注册 SpringMVC 的DispatcherServlet,并配置url映射
  • 编写springmcv-servlet.xml,在其中配置几个重要的组件,处理映射器(HandlerMapping)、处理适配器(HandlerAdapter)、视图解析器(ViewResolver)
  • applicationcontext.xml文件中引入springmvc-servlet.xml文件

以上这几步只是配置好了 SpringMVC,如果我们还需要与数据库进行交互,就要在 application.xml 中配置数据库连接池 DataSource,如果需要数据库事务,还需要配置 TransactionManager… 等等。

以上会带来两个明显的问题:

  • 依赖导入问题: 每个项目都需要来单独维护自己所依赖的 jar 包,手动导入依赖容易出错,且无法统一集中管理。
  • 配置繁琐: 在引入依赖之后需要做繁琐的配置,并且这些配置是每个项目来说都是必要的,例如 web.xml 配置(Listener 配置、Filter 配置、Servlet 配置)、log4j 配置、数据库连接池配置等。

而使用 Spring Boot 的 starters(场景启动器)解决上述的两个痛点,Spring Boot 通过将我们常用的功能场景抽取出来,做成的一系列场景启动器。

我们只需要在项目中引入这些 starters,相关场景的所有依赖就会全部被导入进来,并且我们仅需要通过配置文件来进行少量的配置就可以使用相应的功能。


二、如何自定义 Starter

一般在企业开发中,会有专门的 git 仓库(组)来统一放置各个系统对应的 Starter 项目,其中会包括一个空的框架,拉取下来后我们就可以自己开发了。

在开发之前,我们需要知道常见的使用场景有哪些:

  • API 调用: 将某系统的部分功能经过封装后通过 API 暴露出去,方便内部/外部系统调用,调用时需要经过认证;
  • 基础组件: 比如全局统一的 Http 组件、缓存组件和一些通用工具包等,目的是提升团队开发效率和形成开发规范;
  • 底层框架: 主要是公司自研的系统框架,如 Netty 通信、Maven 插件、ORM 框架等等,用于项目开发的基础支持。

2.1命名规范

Spring Boot 官方推荐的命名规范如下:

  • 前缀:spring-boot-starter-
  • 模式:spring-boot-starter-模块名
  • 举例:spring-boot-starter-web、spring-boot-starter-jdbc 等

我们自定义开发推荐的命名:

  • 前缀:xx-spring-boot-starter
  • 模式:xx模块-spring-boot-starter
  • 举例:业务线-系统名-spring-boot-starter、saas-user-spring-boot-starter等

2.2整体结构

一个 starter 的整体实现逻辑主要由两个基本部分组成:

  1. xxxAutoConfiguration:自动配置类,对某个场景下需要使用到的一些组件进行自动注入,并利用xxxProperties类来进行组件相关配置。
  2. xxxProperties:某个场景下所有可配置属性的集成,在配置文件中配置可以进行属性值的覆盖。

按照 SpringBoot 官方的定义,starer 的作用就是依赖聚合,因此直接在 starter 内部去进行代码实现是不符合规定的,starter 应该只起到依赖导入的作用,而具体的代码实现应该去交给其它服务/模块来实现。

2.3模块开发

2.3.1依赖引入

首先所有的自动配置模块都要引入两个 jar 包依赖:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<!-- 包含很多与自动配置相关的注解的定义,必须要引入 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<!-- 可以通过其它 .properties 文件为相关类进行属性映射,SpringBoot 默认使用 application.yml-->
<optional>true</optional>
</dependency>
<dependencies>
2.3.2xxxAutoConfiguration的实现

xxxAutoconfigure 模块中最重要的就是自动配置类的编写,它为我们实现组件的自动配置与自动注入。在编写自动配置类的时候,我们应该要考虑向容器中注入什么组件,如何去配置它。

@Configuration
@EnableConfigurationProperties(xxxProperties.class)
public class xxxAutoConfiguration { @Resource
private xxxProperties properties; @Bean
public static BeanYouNeed beanYouNeed() {
BeanYouNeed bean = new BeanYouNeed()
bean.setField(properties.get(field));
bean.setField(properties.get(field));
}
}
2.3.3 xxxProperties的实现

这是跟配置文件相绑定的类,里边的属性就是我们可以在配置文件中配置的内容,然后通过@ConfigurationProperties将其与配置文件绑定:

//使用 @ConfigurationProperties 注解绑定配置文件
@ConfigurationProperties(prefix = "your properties")
public class xxxProperties {
private String url;
private String key;
private String secret;
}
2.3.4配置spring.factories文件

在 resource 目录下新建META-INF文件夹,在文件夹下新建spring.factories文件,并添加写好的xxxAutoConfiguration类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xx.xx.xx.autoconfigure.xxxAutoConfiguration

三、浅析 Spring Boot 自动配置原理

在这一小节我将分析 Spring Boot 在创建 Stater 时主要帮我们完成的两件最关键的事情:

  • 相关组件的自动导入
  • 相关组件的自动配置

这两件事情统一称为 SpringBoot 的自动配置。

3.1自动配置原理

我们从主程序入口来探索一下整个过程的原理:

@SpringBootApplication //标注这个类是一个 springboot 的应用
public class MyApplication {
public static void main(String[] args) {
//将 springboot 应用启动
SpringApplication.run(MyApplication.class, args);
}
}

@SpringBootApplication注解内部结构如下图3-1所示:

图3-1

我们可以去到上边提到的spring.factories文件中去看一下,找到 spring 官方提供的spring-boot-autoconfigure包,再去找一下该文件,如图3-2所示:

图3-2

可以看到这个就是SpringBoot官方为我们提供的所有自动配置类的候选列表。

我们可以在其中找到一个我们比较熟悉的自动配置类去看一下它内部的实现,可以看到这些一个个的都是JavaConfig配置类,而且都通过@Bean注解向容器中注入了一些 Bean,如图3-3所示:

图3-3
小结:

  • SpringBoot 在启动的时候从类路径下的META-INF/spring.factories中获取 EnableAutoConfiguration 指定的所有自动配置类的全限定类名;
  • 整个 J2EE 的全部解决方案和自动配置都在spring-boot-autoconfigure的 jar 包中,将这些自动配置类导入容器,自动配置类就生效;
  • 上面2点会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件,并配置好这些组件 。

3.2自动配置的过程

SpringBoot 中所有可配置项都集中在一个文件中(application.yml),这个文件中的配置通过@ConfigurationProperties注解来与我们程序内部定义的 POJO

类来产生关联,这些 POJO 类统一命名为xxxProperties,并且这些xxxProperties类中各个属性字段都有自己的默认值。

这也是 SpringBoot 约定大于配置理念的体现,尽可能减少开发人员做选择的次数,但同时又不失灵活性。只要我们想,配置文件中的配置随时可以覆盖默认值,如图3-4所示:

图3-4

小结:

  • 首先容器会根据当前不同的条件判断,决定这个配置类是否生效;
  • 一但这个配置类生效,这个配置类就会给容器中添加相应组件;
  • 这些组件的属性是从对应的 properties 类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
  • 所有在配置文件中的属性都是在 xxxxProperties 类中封装着,配置文件可以配置什么内容,可以参照该前缀对应的属性类中的属性字段。

四、文章小结

到这里关于Spring Boot Starter 的应用场景与自动配置就分享完了,stater 的开发和使用并不难,最重要的掌握使用场景和自动配置,这样无论是什么类型的 stater 都可以快速掌握运用在项目里。

最后,如果文章有不足和错误,还请大家指正。或者你有其它想说的,也欢迎大家在评论区交流!

【主流技术】Spring Boot Starter 的应用场景与自动配置的更多相关文章

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

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

  2. Spring Boot Starter 介绍

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

  3. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  4. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  5. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  6. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  7. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  8. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

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

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

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

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

随机推荐

  1. 你的语言模型实际是一个奖励模型!😁Direct Preference Optimization:Your Language Model🎭is Secretly a Reward Model

    直接偏好优化:你的语言模型实际上是一个奖励模型 其实每张PPT图下面还有解释的注释,但放上去还要改格式,太多啦!所以就靠大家读论文脑补啦! 摘要 1.引言 2.相关工作 3.预备知识 4.直接偏好优化 ...

  2. [转]快速搭建简单的LBS程序——地图服务

    很多时候,我们的程序需要提供需要搭建基于位置的服务(LBS),本文这里简单的介绍一下其涉及的一些基本知识. 墨卡托投影 地图本身是一个三维图像,但在电脑上展示时,往往需要将其转换为二维的平面图形,需要 ...

  3. [转]swing中如何将jtable中的数据导入到excel中?

    这个版本的代码是可以支持中文,需要导入jxl.jar包,并添加到Build Path中(自行搜索下载). 最终代码: package test; import java.awt.event.*; im ...

  4. RL中on-policy和off-policy的本质区别/重要性采样

    本随笔的图片都来自UCL强化学习课程lec5 Model-free prediction的ppt (Teaching - David Silver ). 回忆值函数的表达式: \[v_\pi(s) = ...

  5. WPF 资源定义空字符串或者空格问题

    xmlns:sys="clr-namespace:System;assembly=mscorlib" WPF在XAML的资源中定义空字符串String.Empty 代码如下: &l ...

  6. org.junit.Assert

    引入包,以下两种方式都是OK的,看个人喜好,我倾向于使用第二种,会更加清晰直观.下面的代码我都会用第二种 import static org.junit.Assert.*; import org.ju ...

  7. Hadoop 概述(一)

    Hadoop概述信息 hadoop 有三大组成部分,HDFS(分布式文件存储系统).YARN(资源管理器).MAPREDUCE(分布式计算框架) ,下边我们来简单介绍一下 HDFS 分布式文件存储系统 ...

  8. CentOS7离线安装Nginx及配置

    下载离线包: 用浏览器打开地址,选择您要下载的版本:http://nginx.org/packages/centos/7/x86_64/RPMS/ 如图,我下载的1.16.1版. 执行安装: 将下载的 ...

  9. Linux 虚拟机中不重启的情况下加新硬盘及扩展根分区容量

    我这个系统是Redhat7.7的系统.磁盘占用比较高,需要扩充空用空间,同时又不能关停服务器,或者服务.所以就需要在虚拟机中不重启的情况下加新硬盘及扩展根分区容量. 首先,看一下我这个虚拟机分区占用情 ...

  10. moectf2023 web wp

    gas!gas!gas! 直接跑脚本 import requests session=requests.Session() url="http://127.0.0.1:14447" ...