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

简介: Spring框架与SpringBoot的关联与区别

前言

Spring是我们作为java开发最常用的框架了,但现如今,大部分项目实际使用的却是SpringBoot。由于它们存在一些关联,导致很多开发对其功能和目的有些混乱,例如说不清一些功能到底是Spring框架的,还是SpringBoot带的?又或者不能清晰的描述两个框架的各自功能和目的,今天,我们就来详细解释这些问题


一、从pom看关联

我们既然想知道两个框架的关联,不如直接开个工程,引入一个基础的Springboot启动器,然后通过依赖关系来分辨两者的联系


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

4d38b7d3b72447989cd4f478153c93ca.png

我们先看三个带标注的包,springBoot启动器是不含代码的,它的唯一作用就是引入各个指定了版本的包,其中最重要的就是spring-boot 和 spring-boot-autoconfigure 两个springboot核心包


而我们要看spring框架 和 springBoot 框架的关系,可以直接看两段红色的依赖性,图中,spring-boot-autoconfigure自动配置包不需要再引用任何东西,而作为核心支持的spring-boot包则需要引入spring框架核心包spring-context 和 spring-core


总结来看,如果我们只关注核心包,springboot框架毫无疑问是建立在spring框架之上的,在spring框架之上,加上一些类比如SpringApplication启动器等,并且配合上自动配置功能


二、spring的目的与不足

1. java EE

在Spring框架创建前,Java EE平台(即Java Enterprise Edition)是企业级应用程序开发的主要框架,该框架的提出主要是因为一个企业级应用的搭建涉及的内容太多,迫切需要一个规范来进行模块分层处理,于是sun公司(现在已经被Oracle收购)希望一些基础的共性的东西由容器去管理,而个性化的东西,如业务由组件去管理,由容器+组件的方式来提供服务。


所以这两方面:容器和组件。容器由各个开发商去根据规范开发,如WebSphere、WebLogic Server等。开发者则去开发组件,然后运行在容器中。由于容器满足了统一的规范,所以组件可以运行在不同的容器上

a45911afae77455f97caa6ce9929a0d9.png


但 它太复杂了。在构建现代企业级应用程序时,开发人员往往需要大量的样板代码和配置,比如在web.xml文件中手动配置Servlet和JSP的映射关系,手动配置数据库连接池和JNDI数据源,手动配置EJB容器的属性以及部署EJB组件等,这些配置内容繁琐,容易出错,并且需要开发人员掌握很多细节,同时这些配置还需要在不同的JavaEE容器之间进行调整。


2. spring的目的

上面我们介绍了java EE的开发与配置过于繁杂,所以Rod Johnson于2002年创建了Spring框架,我们必须明白,spring并不是推翻了javaEE所规范的模式,Spring框架的主要目标是简化Java EE平台的开发,使开发人员可以更专注于业务逻辑,而非容器配置和其他样板代码。


比如上面的Servlet和JSP的映射关系,在spring里,可以由其MVC框架(也称为Spring Web MVC)将应用程序分解为模型、视图和控制器的模式,同时控制器可以通过注解来映射哪些请求应该由哪个方法处理,从而简化了Servlet和JSP映射配置,

b0573166bc04401dbff7f50b57552e58.png


除了springmvc以外,spring框架其实包含了多个包,其中 spring-core(包含spring-context、spring-beans、spring-aop)毫无疑问是重中之重。,这些核心包中包含了大量的底层设计,来帮助开发者减少代码负担


其中有两个功能和模式是最大的提升,能大量简化开发代码。这就是我们常说的Spring框架的两大核心 —— IOC 与 AOP


3. spring的特性

很多开发提及spring,都能知道Spring框架的两大核心 —— IOC 与 AOP,这也一直是面试高频题。但这两者对开发者有什么裨益却语焉不详了,我们就用最简单的话来解释一下


3.1 IOC(控制反转)

介绍:控制反转(Inversion of Control)的名字源于它对传统编程方法的反转。在传统编程方法中,程序员通过代码来控制各种对象之间的依赖关系,程序员需要显式地在代码中创建和管理各个对象并决定它们之间的依赖关系。而在IOC中,控制对象的创建和管理的不再是程序员自己,而是由容器来完成,即容器来“控制”对象的创建和管理,“反转”了对象的创建和管理的控制权

14a7b5d8fe224754b71c7735ba384509.png


很明显能看出,IOC的引入,将各组件解耦了。按照传统编码方式,我们在A类中显式的new 出一个B类,如果我们要把B类替换成一个BB类,那么A类这个地方的引用也需要修改,引用B的地方如果很多呢?那岂不是要大面积改动?


你也许会自然而然的想到,难道不能把B类和BB类都实现同一个接口,或者BB类继承自B,然后通过向上转型解决这个问题吗? 很高兴你有这种想法,这种想法是可行的。但从工程角度而言,限制太大,很多类没有接口或无法继承,那么就没法用这个方法了。


那么通过容器解耦到底是怎么实现的呢?其实是通过DI(依赖注入) 解决的

85431029cdce41ada083cea114db8aa8.png

可以看到传统模式,创建A对象,我就得新建个B和C,新建B又得新建C和D,如同套娃。而在IOC模式,创建A时,容器会主动为你寻找并装填B和C,不用你再新建(除非容器里也没有)。而提供B需要的C和D,同样不需要你管,容器会找到C和D,装填在B上,然后又把B为你装填在A上。


这种把A依赖的B和C主动装填上的模式,就叫依赖注入。依赖注入是IOC的一种具体实现,不仅让开发者不用频繁的new对象(尤其是对象还嵌套对象时),而且能减少重复对象,省事且省空间


3.2 AOP (面向切面编程)

AOP的基础是动态代理,而动态代理jdk和CGlib都可以实现,也就是说使用原始的java EE也是可以做出切面效果的,但是开发者得手动写大量的代码来进行切面的植入,而且往往还不具备通用性。


Spring则以框架的形式帮你完成了这部分代码,且实现了通用,你只需要按照要求,使用一些切面简单的配置就能完成大面积的切面增强


f0a1c7fd81a64530909f147454a78a7c.png

具体可以参考另一篇文章:Spring核心特性—— AOP(面向切面编程)


4. Spring的不足

我们说spring框架是为了减少传统java EE项目的配置强度和开发强度的,而且spring曾经的介绍是个

可以针对bean的生命周期进行管理的轻量级框架,然而,发展到现今的spring,功能越来越丰富,代码规模也越来越大,它“轻量级”的身份也不再那么贴合了。


此时的spring也逐渐露出诸多问题,由于日渐庞大的功能支持,导致使用者的学习成本大大增加且不说,就连其初衷也渐渐背离了,我们现在来说说spring的一些弊端:


  1. 配置繁琐,本身spring就是为了减少程序配置而创建的框架,然而发展至今,spring框架要做的功能和兼容也越来越繁杂,导致框架本身的xml配置也越来越多
  2. 复杂的体系,spring按照模块划分成了多个包,想用事务得引用spring-tx,测试得引用spring-test。对于初学者来说懵懂又麻烦
  3. 版本依赖,spring版本的升级很频繁,很容易出现spring组件间的版本冲突,需要手动管理各组件的版本依赖

目录
相关文章
|
11天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
554 6
|
9天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
9天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
16天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
27 2
|
16天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
Java 应用服务中间件 Spring
Netweaver的端口号和Spring boot内嵌的Tomcat端口
Netweaver的端口号和Spring boot内嵌的Tomcat端口
Netweaver的端口号和Spring boot内嵌的Tomcat端口
|
10天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
10天前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
52 1
|
8天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
23 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
9天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
下一篇
无影云桌面