Spring | IOC、DI、MVC解释(以Ruoyi为例)
【Spring】IOC、DI讲解
IOC
IOC:控制反转。
顾名思义,也就是说对象由spring来创建,不再由程序本身来new创建,用户是主动方。
那Why需要IOC思想呢?
实例化一个组件其实很难,例如,BookService和UserService要创建HikariDataSource,实际上需要读取配置,才能先实例化HikariConfig,再实例化HikariDataSource。
没有必要让BookService和UserService分别创建DataSource实例,完全可以共享同一个DataSource,但谁负责创建DataSource,谁负责获取其他组件已经创建的DataSource,不好处理。类似的,CartServlet和HistoryServlet也应当共享BookService实例和UserService实例,但也不好处理。
很多组件需要销毁以便释放资源,例如DataSource,但如果该组件被多个组件共享,如何确保它的使用方都已经全部被销毁?
随着更多的组件被引入,例如,书籍评论,需要共享的组件写起来会更困难,这些组件的依赖关系会越来越复杂。
测试某个组件,例如BookService,是复杂的,因为必须要在真实的数据库环境下执行。
从上面的例子可以看出,如果一个系统有大量的组件,其生命周期和相互之间的依赖关系如果由组件自身来维护,不但大大增加了系统的复杂度,而且会导致组件之间极为紧密的耦合,继而给测试和维护带来了极大的困难。
因此,核心问题是:
谁负责创建组件?
谁负责根据依赖关系组装组件?
销毁时,如何按依赖顺序正确销毁?
解决这一问题的核心方案就是IoC。
在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。
因此,IoC又称为依赖注入(DI:Dependency Injection),它解决了一个最主要的问题:将组件的创建+配置与组件的使用相分离,并且,由IoC容器负责管理组件的生命周期。
举个ruoyi例子:
使用@Service
注解后,SysUserServiceImpl
类不再需要在程序中new,这个对象由Spring来创建,并放在了Spring容器中
在这里@Service是告知Spring容器去创建这个对象,@Service
底层是由@Componet
封装的。如下图
DI
DI:依赖注入
简单来说是配合IOC使用的,将Spring容器中创建的组件,注入到当前声明的对象上。
举个ruoyi例子:
通过@Autowired
注解,将容器中的ISysUserService组件注入到当前声明的对象userService。
这里ISysUserService是接口,它的唯一实现类是SysUserServiceImpl
共享同一个ISysUserService组件
DI的好处:实现了程序的解耦,便于维护。
【Spring】MVC讲解
SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring,springMVC就相当于是Struts2加上Spring的整合。
简单来说是MVC是Web开发的架构,用来处理浏览器的HTTP请求,处理之后返回HTTP响应给浏览器。
SpringMVC的原理和组成:
举个ruoyi例子:
使用注解@RestController
注册Controller
@ResponseBody是将所有返回数据转成JSON格式
使用注解@GetMapping
、@PostMapping
注册HTTP处理函数
注册HTTP Method处理函数的常用注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
总流程:前端发送请求->经过SpringMVC找到对应处理函数->返回JSON给前端
Reference
liaoxuefeng对SpringIOC原理的分析:https://www.liaoxuefeng.com/wiki/1252599548343744/1266265100383840
spring官网IOC介绍:https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html
spring官网DI介绍:https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html
Spring、SpringMVC和SpringBoot看这一篇就够了:https://cloud.tencent.com/developer/article/1665045
手写Web MVC:https://www.liaoxuefeng.com/wiki/1539348902182944/1539427939647521