spring-第一章 初识spring

springframwork

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

例如:第一章 认识sping


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

spring框架与我们java开发关系密切,是必须掌握的知识之一。


1.OCP开闭原则

1.1说明

OCP开闭原则是软件七大开发原则中最基本的原则:

  • 对拓展开放
  • 对修改关闭

即:在拓展系统功能的时候只应该添加新的功能代码,而不能修改到已经完成的代码。

因为一旦修改到已经完成的代码,则需要对这些代码重新进行测试,增加了工作量。

1.2普通web程序存在问题

但我们一开始的web项目开发方式并不能保证OCP原则

举例:

我们现在有一个三层架构的web项目(dao层、service层、web层)如下:

service层使用了dao层实现对象、web层使用了service层实现对象。三层间相互调用代码之间耦合。

假设我们一开始是使用mysql作为数据库,所以dao层是使用一个名为UserDaoImplForMysql实现类来进行mysql相关操作:

现在要拓展功能------我们dao层要从原本的mysql数据库改用oracle数据库。

于是我们的步骤为:

  1. 写一个调用oracle数据库的dao层实现类
  2. 修改service层中创建的dao层对象

可以看出,在这个过程中我们除了在dao层中添加了oracle实现类外,还修改了service中的代码,但sevice中的逻辑代码是已经全部完成了的,这种操作让我们不得不对service层也重新测试。

于是不能保证OCP原则。

2.依赖倒置原则DIP

2.1说明

上面举例的案例中,上层依赖下层,我们下层一旦修改就必须去修改上层,这样一来就违背了依赖倒置原则。

想要遵循依赖倒置原则,就要让上层不在依赖下层,不会发生下层修改上层也要跟着修改的问题。

2.2如何修正

让我们面向抽象编程而不是面向具体编程。

举例来说就是,我们service的实现类中在引用dao层对象时不用关心具体使用的是哪一个dao层实现类对象,而只是说我们引用了dao层对象。

如下,我们不再具体指定引入哪一个实现类而是只说我需要引入dao对象。

但这并不是说我们用不到dao层实现类,如上写法就只是声明了一个空的userDao对象,并不能使用,所以我们还是需要使用具体的实现类为其赋值的,只是说选择或切换哪一个实现类来赋值的操作由其他东西来代替我们完成(看下面IOC)。

这样一来即使我们对dao层的实现类进行修改,也不会引起service层跟着变动,解除了上层service层对下层dao层的依赖。

3.控制反转IOC

3.1说明

IOC控制反转就是spring中实现前面两种原则的关键。

spring中提供了IOC容器,这个IOC容器可以自动为对象赋值,也就是说由IOC容器来替我们完成了筛选和创建具体实现类的操作,相当于"创建实现类"的权力从我们手里转换到了程序手中,所以叫控制反转。

使用IOC我们做到了两件事的转换:

  • 对象创建的权力的转换
  • 对象关系维护的转换

3.2实现

我们已经知道spring会帮助我们完成创建对象管理对象关系 的工作,也就是它实现了IOC控制反转,那么它究竟是如何做的?

spring使用依赖注入(DI)来实现IOC,详情看下一节。

4.DI依赖注入

4.1说明

DI是spring为属性赋值的方式,也是spring实现IOC的方式。

DI中有两种常见的方式来为属性赋值:构造器赋值set赋值

需要说明的是IOC容器不仅会创建对象本身,还会为该对象中的引用类型的属性赋值,也就是说,我们需要一个A对象,A对象中有一个B类型属性,于是可以看作A依赖了B,我们向spring的IOC容器索要这个A对象时,容器不仅会创建出A对象,还会为A中的这个B类属性赋值。最后提供给我们一个完整的A对象。

4.2使用

请看后实操请看后面章节。


总结

`spring使用DI来实现了IOC,从而降低了我们原本javaweb项目中耦合度。这篇是对spring框架的的引入导读。

相关推荐
蓝天星空1 分钟前
spring cloud gateway 3
java·spring cloud
罗政6 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第9章 插件与链路的结合:Mysql插件实现
java·mysql·pdf
一根稻草君12 分钟前
利用poi写一个工具类导出逐级合并的单元格的Excel(通用)
java·excel
kirito学长-Java15 分钟前
springboot/ssm网上宠物店系统Java代码编写web宠物用品商城项目
java·spring boot·后端
海绵波波10722 分钟前
flask后端开发(9):ORM模型外键+迁移ORM模型
后端·python·flask
余生H26 分钟前
前端Python应用指南(二)深入Flask:理解Flask的应用结构与模块化设计
前端·后端·python·flask·全栈
木头没有瓜29 分钟前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp
奋斗的老史29 分钟前
Spring Retry + Redis Watch实现高并发乐观锁
java·redis·spring
high201131 分钟前
【Java 基础】-- ArrayList 和 Linkedlist
java·开发语言
老马啸西风38 分钟前
NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character
java