【主流技术】Spring Boot Starter 的应用场景与自动设置

打印 上一主题 下一主题

主题 983|帖子 983|积分 2949

目次

前言

一、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 的整体实现逻辑主要由两个基本部门构成:

  • xxxAutoConfiguration:自动设置类,对某个场景下需要使用到的一些组件进行自动注入,并利用xxxProperties类来进行组件相关设置。
  • xxxProperties:某个场景下全部可设置属性的集成,在设置文件中设置可以进行属性值的覆盖。
按照 SpringBoot 官方的定义,starer 的作用就是依靠聚合,因此直接在 starter 内部去进行代码实现是不符合规定的,starter 应该只起到依靠导入的作用,而详细的代码实现应该去交给别的服务/模块来实现。
2.3模块开发

2.3.1依靠引入

起首全部的自动设置模块都要引入两个 jar 包依靠:
  1. <dependencies>
  2.      <dependency>
  3.          <groupId>org.springframework.boot</groupId>
  4.          <artifactId>spring-boot-autoconfigure</artifactId>
  5.         
  6.      </dependency>
  7.      <dependency>
  8.          <groupId>org.springframework.boot</groupId>
  9.          <artifactId>spring-boot-configuration-processor</artifactId>
  10.       
  11.          <optional>true</optional>
  12.      </dependency>
  13. <dependencies>
复制代码
2.3.2xxxAutoConfiguration的实现

xxxAutoconfigure 模块中最紧张的就是自动设置类的编写,它为我们实现组件的自动设置与自动注入。在编写自动设置类的时间,我们应该要思量向容器中注入什么组件,如何去设置它。
  1. @Configuration
  2. @EnableConfigurationProperties(xxxProperties.class)
  3. public class xxxAutoConfiguration {
  4.    
  5. @Resource
  6. private xxxProperties properties;
  7.    
  8.     @Bean
  9.     public static BeanYouNeed beanYouNeed() {
  10.      BeanYouNeed bean = new BeanYouNeed()
  11.      bean.setField(properties.get(field));
  12.      bean.setField(properties.get(field));
  13.     }
  14. }
复制代码
2.3.3 xxxProperties的实现

这是跟设置文件相绑定的类,里边的属性就是我们可以在设置文件中设置的内容,然后通过@ConfigurationProperties将其与设置文件绑定:
  1. //使用 @ConfigurationProperties 注解绑定配置文件
  2. @ConfigurationProperties(prefix = "your properties")
  3. public class xxxProperties {
  4.     private String url;
  5.     private String key;
  6.     private String secret;
  7. }
复制代码
2.3.4设置spring.factories文件

在 resource 目次下新建META-INF文件夹,在文件夹下新建spring.factories文件,并添加写好的xxxAutoConfiguration类:
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.xx.xx.xx.autoconfigure.xxxAutoConfiguration
复制代码
三、浅析 Spring Boot 自动设置原理

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

  • 相关组件的自动导入
  • 相关组件的自动设置
这两件事情统一称为 SpringBoot 的自动设置。
3.1自动设置原理

我们从主程序入口来探索一下整个过程的原理:
  1. @SpringBootApplication //标注这个类是一个 springboot 的应用
  2. public class MyApplication {
  3.     public static void main(String[] args) {
  4.         //将 springboot 应用启动
  5.         SpringApplication.run(MyApplication.class, args);
  6.     }
  7. }
复制代码
@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 都可以快速把握运用在项目里。
最后,假如文章有不足和错误,还请大家指正。或者你有别的想说的,也欢迎大家在评论区交流!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表