SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

本文介绍了SpringBootStarter技术,探讨了其如何简化配置并提供自动配置模块,还讲解了Spring官方与非官方Starter的区别。文章重点介绍了常用Starter组件,并深入分析了SpringBoot安全管理与自定义Starter实现。

Spring Boot Starter技术

Spring Boot Starter概述

Spring Boot能够迅速地在微服务开发领域流行起来,并影响众多Spring和Java开发社区开发人员,可以说主要原因有两个。

● 一 是 Spring 的 约 定 优 于 配 置 的 特 性 ( Convention OverConfiguration),这个特性的关键实现机制就是自动装配机制。同时这一特性很好地遵循了简约开发原则,它不仅减少了软件开发人员的开发工作量和需要做的决定数量,获得简单易用的收益,而且方便扩展又不失灵活性。从Spring到Spring Boot,从Ant到Maven,本质上都践行了约定优于配置的原则。

● 二是Spring Boot基于“Spring Boot Starter技术”,即开箱即用的自动配置模块。在传统Spring应用系统中,我们需要完成众多的烦琐配置和多个jar包的手动引入及代码的初始化工作,才能将所需要的模块引入工程中。而Spring BootStarter的出现,简化了我们的配置,更重要的是将我们带入一种“可插拔”的编程模式。我们只需要在Maven中引入对应的现成Starter依赖,在代码中添加必要的注解,就可以获得开箱即用的对应功能。同时,我们可以结合Spring Boot的自动配置机制,实现自定义Starter组件,从而成为一个自包含的组件和模块,供第三方使用。

从Starter的命名方式我们可以区分出两类Starter。

● Spring 官 方 Starter : 命 名 应 遵 循 spring-boot-starter-{name} 的 格 式 , 如 spring-boot-starter-web 作 为 SpringBoot Web模块的官方artifactId。

● Spring 非 官 方 Starter : 命 名 应 遵 循 {name}-spring-bootstarter的格式,如
mybatis-spring-boot-starter。本章中介绍的自定义Starter属于后者。

Spring官方Starter

对于Spring官方Starter,只需在pom.xml配置文件中增加对于Starter的依赖,这个Starter就能够通过代码配置上下文发现并将所需要jar包进行关联,在自动配置类中可以通过@ConditionalOnClass来决定是否实例化(ConditionalOnClass是指在classpath发现需要的依赖的类时实例化)。

所有的Starter其实都是要通过代码配置被上下文发现的,可以在
spring-boot-autoconfigure-xxx.jar源码包中查看,例如下图所示,我们可以看到Spring Boot自带的Starter实现。

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

对 于 Spring Boot 内 置 Web 容 器 来 说 , 只 要 通 过@ConditionalOnClass 发 现 了 Tomcat 这 个 类 ( 配 置 了 spring-bootstarter-web的Maven依赖),Spring Boot就会自动检查项目依赖并启动Tomcat服务,如下代码所示:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

Spring非官方Starter

原理上基本与官方Starter一致,需要在已经实现的artifactId上再封装一层,这一层只负责包含具体的实现类和配置类,而这个Starter的pom.xml文件相当于一个Facade门面,代码如下:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

进入pom.xml文件,可以发现自包含的依赖关系,代码如下:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

在 这 个 pom.xml 文 件 中 , 我 们 发 现 了 mybatis-spring-bootautoconfigure 自 动 配 置 类 , 通 过 它 我 们 可 以 完 成 MyBatis 配 置JavaConfig的自动配置工作和MyBatis实例化配置。它的配置类代码如下:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

通过MybatisAutoConfiguration自动化配置类,就实现了MyBatis的配置在启动时被Spring Boot程序加载到Spring Boot的Factory工厂并实例化为Bean。

Spring Boot常用开箱即用Starter

开箱即用的Starter组件也遵循Spring约定优于配置的理念,针对企业日常应用开发场景,通过引入这些现成的Starter可以简化开发流程。

spring-boot-starter-web快速开发

除了开发少数的独立应用,大部分情况下,我们都使用SpringMVC组件开发企业Web应用,为了帮助我们快速搭建并开发一个Web项目,Spring Boot提供了spring-boot-starter-web自动配置模块,只要将spring-boot-starter-web加入项目的Maven依赖即可:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

在我们的工程中加入上面的Starter依赖后,就得到了一个可直接执行的Web应用环境,在当前项目下运行mvn spring-boot:run,可以直接启动一个使用了嵌入式Tomcat服务请求的Web应用服务。目前我们还没有提供任何Web请求的Controller,所以访问任何路径都会返回一个Spring Boot默认提供的错误页面,我们可以在当前项目下新建一个服务根路径作为Web请求的Controller实现,如下代码所示:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

spring-boot-starter-jdbc与数据访问

为了使Spring Boot成为我们自动配置数据访问的基础设施,我们需要直接或者间接地依赖spring-jdbc,当spring-jdbc位于SpringBoot应用的classpath路径时,会触发数据访问相关的自动配置行为。

最简单的做法就是把spring-boot-starter-jdbc添到应用的依赖文件中。默认情况下,如果我们没有配置任何DataSource,那么SpringBoot会为我们自动配置一个基于嵌入式数据库的DataSource,这种自动配置行为其实很适合于测试场景,但对实际的开发帮助不大,基本上我们会自己配置一个DataSource实例。下面我们将spring-bootstarter-jdbc加入项目的Maven依赖:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

如果我们的工程只依赖一个数据库,那么使用DataSource自动配置模块提供的参数是最方便的。在本书的7.1.4节中,我们会对“使用spring-boot-starter-jdbc访问MySQL”进行详细讲解。

spring-boot-starter-aop及其使用场景

在Java语言中,AOP(Aspect Oriented Programming,面向切面编程)通过提供另一种思考程序结构的方式来补充OOP(ObjectOriented Programming,面向对象编程)。OOP中模块化的关键单元是类。而在AOP中,模块化单元由“切面”组成。通过预编译方式和运行期动态代理实现程序功能的统一维护。AOP是Spring框架的一个重要特色,它可对既有程序定义一个切入点(Pointcut),然后在切入点前后切入不同的执行任务。常见使用场景有:打开/关闭数据库连接、打开/关闭事务、记录日志等。基于AOP不会破坏原来的程序逻辑,因此它可以很好地对业务逻辑的各个部分进行抽离,从而使得业务逻辑各个部分的耦合度降低,提高程序的复用性,同时提高开发效率。

Spring Boot对AOP提供了Starter组件支持,Maven依赖如下:

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

spring-boot-starter-aop主要由两部分组成:


org.springframework.boot.autoconfigure.aop.AopAutoConfiguration:提供配置类。

● 通知:配置类中涉及的通知类型有前置通知、后置最终通知、后置返回通知、后置异常通知和环绕通知。

下面是一个实现了Web Controller调用的日志切面打印Web请求参数及相应结果的实例。

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值