谈谈对Spring、Spring MVC、SpringBoot、SpringCloud,Mybatis框架的理解

前言

如果说Java开发是一个厨房,那Spring生态系统就是一套完整的厨具套装,让每个"厨师"都能更高效地烹饪出美味佳肴。

Spring框架 是这套厨具的"基石"。它最厉害的两把刷子是IOC(控制反转)AOP(面向切面编程)------听起来很学术,其实道理很简单:IOC就像从"自己买菜做菜"变成"叫外卖或请保姆",你把控制权交出去,专心吃就行;AOP则像给照片加滤镜,不管你拍的是风景还是人像,统一加上"复古风"或"美颜效果",在不改动原图的情况下增强功能。Spring采用模块化设计,就像乐高积木,你需要什么功能就拼什么,不用背整个工具箱。

SpringMVC 则是专门做"网页外卖"的模块。当你访问一个网站时,DispatcherServlet就像餐厅的前台服务员,负责接收你的订单(请求),然后分发给后厨(控制器)、准备食材(模型)、最后摆盘上桌(视图),整个流程井井有条。

再来说说SpringBoot ------这简直是"懒人福音"。以前用Spring搭环境就像手动组装家具,得看一大堆说明书、拧无数螺丝;SpringBoot则像宜家现成的整装家具,开箱即用。它最大的杀手锏是自动配置,能猜到你想要什么并提前准备好,还支持当下流行的微服务架构,让大型应用拆成一个个独立的小模块,开发部署都轻松不少。

文章还深入讲解了IOC容器 这个"大管家"是如何管理对象的,以及AOP切面这把"瑞士军刀"是怎样在不破坏原有代码的情况下,巧妙植入日志、权限检查等通用功能的。

最后对比了MybatisMybatis-Plus这对"数据库操作双子星":Mybatis像是手动挡汽车,SQL语句要自己写,灵活但费事;Mybatis-Plus则是升级版的自动挡,内置了各种常用操作(CRUD),还自带代码生成器------原本要写几百行的代码,现在一键生成,开发效率直接起飞。

一、Spring

Spring他是一个轻量级的Java开发框架,它的核心是IOC和AOP。

IOC通过依赖注入的方式,管理对象之间的依赖关系;

AOP则提供了面向切面编程的能力,用于处理横切关注点;

Spring提供了丰富的功能模块,包括Core、Context、AOP、ORM、Web等模块,支持灵活组合使用。

二、SpringMVC

SpringMVC则是基于Spring的MVC框架,他实现了Web应用的MVC框架,其中核心组件包括

DispatcheerServlet(前端控制器)

HandlerMapping(处理映射器)

Controller(业务控制器)

ViewResolver(视图解析器)

ModelAndView(模型和视图)

PS:毕业前画的比较潦草,勿喷!!!

SpringMVC提供了很多Web开发功能,是构建Web应用的非常重要的工具。

三、SpringBoot

SpringBoot是基于Spring的快速开发框架,它的核心目标是简化 Spring 应用的初始搭建以及开发过程,让开发者能够更快速地开发、部署和运行 Spring 应用程序。

自动配置: Spring Boot 通过 @SpringBootApplication 注解自动配置 Spring 和相关依赖项,减少了大量的配置工作。例如,只需添加 **spring-boot-starter-web**依赖,Spring Boot 就会自动配置一个嵌入式的 Tomcat 服务器和 Spring MVC。

独立运行: Spring Boot 内嵌了 Tomcat、Jetty 等服务器,无需部署 WAR 文件,直接打包为一个可执行的 JAR 文件,通过**java -jar** 命令即可运行。

无代码生成和 XML 配置:Spring Boot 采用约定大于配置的原则,无需编写大量的 XML 配置文件或代码生成工具。大部分配置可以通过简单的注解或配置文件完成。

**微服务支持:**Spring Boot 与 Spring Cloud 等技术结合,能够快速构建微服务架构,支持服务注册、配置中心、网关等功能。

他通过自动配置 基于条件的智能配置机制减少繁琐的XML配置工作和start依赖 简化Maven或Gradle配置,避免版本冲突问题,内嵌服务器集成了Tomcat、Jetty等容器。支持独立运行JAR包。简化部署流程。在yml中配置端口号、数据源之类的。

四、 IOC AOP

1、IOC

IOC思想就是创建对象的控制权,被反转到了Spring框架上。

项目在启动时,Spring框架会自动为我们初始化好一个IOC容器,首先就是在类上添加一个和@bean相关的注解例如@Service,根据配置文件添加Bean对象,然后将Bean对象添加到依赖池中完成装配,如果要使用这个类,直接在类上加@Autowried或者是@Resource这个注解进行依赖注入,这样就可以直接使用对象内封装的属性方法了,这个效果就称为控制反转。

IOC容器的原理

最终,Spring IOC 容器通过封装对象的创建和生命周期管理,使用依赖注入来解耦对象之间的依赖关系,利用反射和配置元数据来动态地创建和管理对象,同时提供作用域管理功能。这些机制共同构成了SpringIOC 容器的原理,使其成为一个强大而灵活的容器,能够支持各种复杂的应用程序开发需求。

2、AOP(面向切面编程)

AOP它是一种编程思想,在不修改现有业务逻辑代码的情况下,动态地添加或修改程序的执行逻辑。

什么是切面?

Spring AOP 的核心在于"切面",可以说理解了"切面"就理解了 AOP。这里结合两个例子进行说明。

  1. 权限校验拦截

目前,最常用的一种权限校验方式就是基于token 进行校验,基本思想是:用户登录时给用户返回一个字符串 token,之后针对接口的请求,都需要携带该token,那在需要权限校验的所有控制器中,执行对token 的校验操作。这样一来,校验 token 的代码逻辑需要在很多Controller 中编写一次,解决方案当然有,其中一种就是 AOP。注意表述:把所有的 Controller标记为一个切人点,在切人点之前创建一个切面,切面中实现 token 校验逻辑。

  1. 动态切换数据源

假设有一个需求,项目中想要动态的支持多数据源,要如何做呢?一种思路是,可以在Controller 对应的方法上,添加自定义注解 @DS,指定不同的数据库。在这个例子中,注意表述:可以将 @DS 注解标识的方法定义为"切人点";另外,再定义一个切面类,在这个切面类中,编写多数据源业务逻辑,如此一来,框架启动时,就会将切面织人到原有业务逻辑。客户端请求在触发调用Controller 时,就会自动去切换数据源了。

有了上面的理解之后,此时,再去尝试理解面向切面编程:(1)标记切人点(2)创建切面,编写公共代码。实际上,往往我们编写公共逻辑代码的那个类,就是切面。

下面是一个关于AOP使用的记录日志的例子

java 复制代码
Slf4j
@Aspect                                           // 声明这是一个切面
@Component
public class LogAspect {

    private final ObjectMapper objectMapper = new ObjectMapper();
    
    // 需要过滤的敏感字段
    private static final List<String> SENSITIVE_FIELDS = Arrays.asList(
        "password", "pwd", "token", "secret", "key"
    );

    @Pointcut("execution(* com.project.platform.controller.*.*(..))") // 定义切点,匹配所有控制器方法
    public void controllerPointcut() {}

    @Around("controllerPointcut()")              // 环绕通知,在切点方法执行前后都会触发
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // AOP实现的方法体...
    }
    
    // 辅助方法...
}

五、Mybatis

Mybatis是一个半自动化的ORM持久层框架,他底层是封装了JDBC,支持自定义的SQL。

优点:

1、它的SQL和代码是分离的,不像JDBC还在在代码片段中编写SQL语句,这样使得代码更加简洁、清晰、容易维护。

2、它可以自动帮我们完成数据库字段和Java对象属性关系的映射,不像JDBC那样还得操作ResultSet来手动完成关系映射

3、动态的支持SQL,比如if/where/trim/foreach等,可以大大减少代码的开发成本。

4、支持多种分页查询,例如手动使用limit关键字进行分页,还可以使用Mybatis中默认的RowBounds作为参数进行分页。

缺点:

1、数据库的移植能力较差。这就是半自动 ORM 框架的弊端,因为 SQL 都需要自己编写,所以数据库的移植能力就比较差,需要根据每套数据库方言定制一套单独的 SQL。

2、代码量偏大。这同样是半自动 ORM 框架的不足之处,全自动的 ORM 可以根据映射关系自动帮我们生成一套 CRUD 操作的接口,使用这些接口直接操作数据库可以大大的减少我们的代码量。当然了,MvBatis 官方也考虑到这一点,由他们提供的generator 项目也同样可以完成类似的功能。

六、MYbatis-Plus

优点:

1、强大的 CRUD 操作。MyBatis-Plus 内置了通用的 Mapper 和通用的 Service,我们仅需要简单的配置即可成单表大部分的CRUD 操作,而且 MvBatis-Plus 还提供了强大的条件构造器,除了复杂的业务场景外,我们几乎无须在手动编写 SQL 语句。

2、支持 Lambda 表达式方式调用。通过使用 Lambda 表达式调用的方式,可以很方便的编写各类的查询条件,无须在担心字段拼写

错误的问题。

3、内置了代码生成器。使用 MyBatis-Plus,我们可以采用代码或者 Maven 插件的方式快速生成 Mapper、Model、Service、Controller 层代码,并且支持模板引擎,大大的减少了我们"重复代码"的开发量。

4、内置了分页插件。MvBatis-Plus 内置的分页是一种物理分页,有了它,我们的分页功能真的变得超级简单!还记得 MyBatis 框架中我们使用的 PageHelper 分页插件吗?它们的原理如出一撤。

5.内置了性能分析插件。通过该插件,我们可以输出执行的 SQL 语句及其执行的时间,在开发测试环境开启此功能,可以帮助我们快速定位慢查询的问题,不得不说,确实是很强大!

相关推荐
ahauedu2 小时前
SpringBoot 3.5.10引入springdoc-openapi-starter-webmvc-ui版本
java·spring boot·后端
我是咸鱼不闲呀2 小时前
力扣Hot100系列15(Java)——[二叉树]总结(有效的括号,最小栈,字符串解码,每日温度,柱状图中最大的矩形)
java·算法·leetcode
沉默-_-2 小时前
MyBatis 学习笔记
java·开发语言·tomcat
未来龙皇小蓝2 小时前
Spring内置常见线程池配置及相关概念
java·后端·spring·系统架构
Elias不吃糖2 小时前
Java 常用数据结构:API + 实现类型 + 核心原理 + 例子 + 选型与性能(完整版)
java·数据结构·性能·实现类
会游泳的石头2 小时前
构建企业级知识库智能问答系统:基于 Java 与 Spring Boot 的轻量实现
java·开发语言·spring boot·ai
澄风2 小时前
Redis ZSet+Lua脚本+SpringBoot实战:滑动窗口限流方案从原理到落地
spring boot·redis·lua
是梦终空2 小时前
计算机毕业设计263—基于Springboot+Vue的影视推荐和评分系统(源代码+数据库)
spring boot·vue·毕业设计·课程设计·协同过滤算法·影评系统·影视推荐系统
说给风听.2 小时前
Maven 配置实战:从环境搭建到 Idea 关联(超详细)
java·maven·intellij-idea