# 前言
最近课设要用 SpringBoot,想着顺便就把这部分博客更新。
但是为什么我选择先更新一下 Spring 呢?因为我根本没在意这个课设🤣,更新是因为学习进度到这了哈哈哈哈。
很多开发者都是直接上手 SpringBoot,会导致对 Spring 整体框架底层,以及发展历史不是很了解,对老旧项目和底层 Bug 分析没有全局观。 Spring
作为一个成熟的,受广大企业爱戴的框架,它已经形成了良好的生态环境,所以学习的时候不能只是当成一个简单的框架,会用就行啥的。
作者也是边更新边学习的,泪目。
这篇文章不会直接讲框架的使用,当然也不是什么 Spring 发展历史,而是对 Spring 的几个核心要点讲解一下,之后在对每个要点挨个切入讲解。
Spring 框架的特性:
- 非侵入式,项目中对象可以不依赖 Spring 的 API
- IOC——
Inversion
:控制反转,对象的创建交给 Spring 管理。 - DI——
Dependency Injection
:依赖对象不需要手动调用 set 方法设置对象属性,而是通过配置赋值。 - AOP——
Aspect Oriented Programming
:面向切面编程,待会会讲,OOP 就是面向对象编程。 - 容器:Spring 本身是一个容器,包含并管理应用对象生命周期。
本篇不讲原理,不演示任何代码,只讲思想。
# Bean
其实就是类,JavaBean 就是有一定规范的 Java 实体类。你总要给它一个好听的名字,才气派。
# IOC
这里就要提到为什么我们需要讲创建对象的控制权交给 IoC 容器,由它根据配置文件来决定到底给我们哪一个实体类。
在这个版本迭代飞起的社会,经常就是出现一个潮流,能赚💴的功能,大家都跟着开发。如果说项目的类与类之间耦合性(或者直接说代码的耦合性)很高,改动代码 —— 牵一发而动全身。有时项目太大了,改个类名都要改一天。
将对象交给 IoC 容器进行管理,比如当我们需要一个接口的实现时,由它根据配置文件来决定到底给我们哪一个实现类,这样,我们就可以不用再关心我们要去使用哪一个实现类了,我们只需要关心,给到我的一定是一个可以正常使用的实现类,能用就完事了,反正接口定义了啥,我只管调用。
用 Java 全栈知识体系的例子:
假设你想查询用户 User,项目是一个 MVC 结构,service 包负责处理查询的业务(需要调用 dao 包的类),dao 包负责处理和数据库的交互,pojo 是实际要查询的类。
那么没有 Spring 框架:
- 我们需要自己创建
UserDao
的实现类,UserService
的实现类。 - 然后讲
UserDao
放进UserService
,最后由UserService
去调用业务方法。
有了 Spring 框架:
- 原来创建 Bean 的工作交给框架,需要时从 Bean 容器中获取。
- 我不在关心拿到
UserService
时是否设置好了UserDao
(正常 mvc 开发就是,UserDao 是 UserService 的一个属性,要用时直接 set 方法传入 dao 的实现类)。
IoC 做到了:Bean 的创建和使用分离了。
# DI
依赖注入,应用程序代码从 Ioc Container 中获取依赖的 Bean,注入到应用程序中,这个过程叫 依赖注入 (Dependency Injection,DI) ; 所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是 IoC 是设计思想,DI 是实现方式。
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
分析:
- 谁依赖谁:应用程序依赖于 IoC 容器。
- 为什么需要依赖:应用程序需要 IoC 容器来提供对象需要的外部资源。
- 谁注入谁:IoC 容器注入应用程序某个对象,应用程序依赖的对象。
- 🌌注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
上面的例子, UserService
依赖 UserDao
,通过 IoC 容器获取 UserService
时,就需要通过依赖注入,讲 UserDao
的实例化对象。
不要想得太复杂,依赖注入也是一种设计模式:在软件工程中,依赖注入(dependency injection,缩写为 DI)是一种软件设计模式,也是实现控制反转的其中一种技术。 這种模式能让一个物件接收它所依赖的其他物件。 “依赖” 是指接收方所需的对象。 “注入” 是指将 “依赖” 传递给接收方的过程。
# AOP
面向切面编程,思想其实就是:在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
AOP 好就好在不会破坏原有代码逻辑,原有业务不变的情况下添加额外动作。
相当于我们的整个业务流程,被直接斩断,并在断掉的位置添加了一个额外的操作,再连接起来,也就是在一个切点位置插入内容。
举个不恰当的例子,你可以将业务流程想象成一个管道,代码就是里面的流。我将一个滤网横向插入管道中,会流经这个位置的流(执行到这的代码)都会进行这个网,网的效果就是增强的操作。
你问能有什么操作?我放一个打印日志的切面不行吗?
# 参考
https://pdai.tech/md/spring/spring-x-framework-introduce.html
https://juejin.cn/post/6857406008877121550
https://juejin.cn/post/6857406008877121550