Spring框架与SpringBoot的关联与区别(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring框架与SpringBoot的关联与区别

三、springboot的诞生

1. springboot的目的

鉴于上文提到的越来越多的spring的弊端,尤其是组件版本与组合的问题。必须要好好管理,由此,在spring的基础上,Pivotal团队提供的全新框架——Spring Boot,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。我们举个配置的例子来详细说明。


传统的spring项目,配置基本以xml为主,比如我们要配置数据源,需要如下配置

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

这是spring自带的数据源类,没有连接池,功能比较薄弱。当然我们可以引入三方包,然后配置成其他数据源类,此处不再赘述。而在springboot中,我们不再以bean的形式维护数据源,而是可以在application.properties里维护


spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root

细心观察,你会发现,springboot下,我们没有手动维护数据源的类,这是因为springboot2.x默认采用了HikariCP作为数据源技术(之前是org.apache.tomcat.jdbc.pool.DataSource),而springboot又是怎么采用HikariCP作为默认数据源的呢? 我在下面的特性章节会为你解释。


2. springboot的特性

2.1 starter启动器

如果你用过spring-boot,不难发现,在springboot下,我们引入的包很多都是带着starter的,比如

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

实际上,这些启动器包大部分本身并不含有代码,而是作为一个依赖管理,为我们引入更具体的其他包。比如spring-boot-starter-jdbc就为我们引入了指定版本的HikariCP组件


fcaf271224d54e6d91b5398378b20d27.png


当然除了jdbc之外,还有很多启动器包,比如:


  • spring-boot-starter-web:包含Spring MVC和Spring WebFlux框架,用于构建Web应用程序。
  • spring-boot-starter-amqp:包含Spring AMQP库和RabbitMQ消息代理,用于处理分布式消息传递。
  • spring-boot-starter-data-redis:包含Spring Data Redis库,用于处理Redis数据存储和访问。
  • spring-boot-starter-test:包含JUnit、Mockito、Hamcrest和Spring Test框架,用于单元测试和集成测试

你或许会问,还是有这么多starter包,如果是新建工程,那不还是得引用很多依赖吗?没错,启动器也是按照模块划分的,并不是一个包就含所有,而是不同模块功能提供一些内置的推荐的组件,让你少点组件版本查询,也少写点些手动依赖。比如说我们说的数据源,它推荐HakariCP,MQ它推荐rabbitMQ。一般在项目初期,如果没有特定组件需求时,采用它默认的就好,后续项目想放弃rabbitMQ,转用rocketMQ,那再替换即可


2.2 自动装配

当我们引入了各类starter包,事情并没有结束,因为是基于spring框架的,很多包引入了以后,我们还需要把加载对应的配置类,然后创建Bean并放入到容器中,对应的功能与配置才算生效


依然以Hakari数据源为例,我们引入了spring-boot-starter-jdbc,也知道该包又引入了Hikari包。那后续呢?这就要提到spring-boot的自动装配功能了。我们把目光放到第一节我们就提及的spring-boot核心包:spring-boot-autoconfigure上

be2a033cb3bb489191b19258886403c6.png



通过这个目录,可以看出,自动装配目前已经覆盖了不少的功能模块,换句话说,你在使用这些功能时,可以享受到自动装配带来的便捷,我们仍用数据源举例。



baac9292c1e14cf693206ef7df311dd1.png

可以看到,在 DataSourceConfiguration 中,会提供几种数据源,但是因为我们只引了Hikari,所以只有它能被加载,这是 基于其上的 ConditionalOnClass 注解,以及 ConditionalOnProperty 中的matchIfMissing = true参数


@ConditionalOnProperty(
  name = "spring.datasource.type", 
  havingValue = "com.zaxxer.hikari.HikariDataSource",
  matchIfMissing = true)

这两个注解保证了,在有hikari包的情况下,无需任何显式的配置,就可加载DataSourceConfiguration.Hikari。


  @Configuration(proxyBeanMethods = false)
  @ConditionalOnClass(HikariDataSource.class)
  @ConditionalOnMissingBean(DataSource.class)
  @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
      matchIfMissing = true)
  static class Hikari {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    HikariDataSource dataSource(DataSourceProperties properties) {
      HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
      if (StringUtils.hasText(properties.getName())) {
        dataSource.setPoolName(properties.getName());
      }
      return dataSource;
    }
  }

如图加载这个类后,能为我们创建个Bean。那么现在我们知道它能被加载,又是谁真正负责加载它的呢?答案是是自动配置类,而自动配置类的加载流程,其实已经超出spring-boot的范畴,回到了spring加载Bean的机制,所以这里长话短说。spring在使用外部jar包时,会检查jar包里的spring.factories,扫描并加载这文件里提到的类。


2c89a8e180914b0abff1a1e4f7a99c7c.png


如图,加载了DataSourceAutoConfiguration类,而在该自动配置类中,又实用 import 注解引入了这几种数据源类。当然,我们从上面知道,import虽然是import了,但这几个数据源类上又各自有注解,导致最后其实只有hikari成功注册了Bean


8edbe006ecba4ebe858dea6634fbf3b8.png


2.3 内嵌应用服务器

除了上面提及的一些配置上的自动化,spring备受欢迎的更大原因,是因为其可以内置Tomcat、Jetty或Undertow(无需部署WAR文件),并提供一些默认配置,免去了开发者手动安装和配置应用服务器的烦恼。这在提倡微服务的年代,可谓是如虎添翼

关于spring-boot内嵌服务器的原理,是一个比较庞大的内容,我们后续会专门讲解。


四、总结关联与区别

关联:


  • 功能几乎一致:Spring Boot是基于Spring框架,因此可以使用Spring框架提供的所有功能
  • 目的一致:简化开发配置,spring是为了简化原始的javaEE模式,而spring-boot则是为了简化spring项目的搭建和配置

区别:


  • Spring需要手动引入各种依赖库,并一一确定版本,而Spring Boot则通过各类启动器自动引入依赖库来简化应用的构建,且启动器会帮你确定好匹配的各组件版本。
  • Spring依赖于外部的配置文件(如XML、Java Config等),而Spring Boot提供了“约定大于配置”的方式,可以通过默认约定处理常见的配置需求
  • Spring Boot可以内嵌应用服务器,独立部署与执行,而spring项目则需要外部提供应用服务器
  • 一句话总结:

早期javaEE项目是农村自建住宅,都是房子,但实现与样式各有区别,非常混乱;

spring则是提供了一个标准房图纸,使用它能快速辅助你搭建出一个标准房型,但房子很多细节,比如桌椅门窗仍然需要你自己敲定;

spring-boot则直接是精装商品房,不仅房子是按标准图纸搭建,桌椅门窗等装修也是有默认的一套,可以直接为你装上。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
275 2
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
130 8
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
398 2
|
缓存 安全 前端开发
SpringBoot整合SpringSecurity带图片验证码简单实现
针对把code码放到httpServletRequest中易引发并发问题,考虑之后,实现把code码放入到login的提交表单内,与用户名和密码一起发送。
SpringBoot整合SpringSecurity带图片验证码简单实现
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。