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框架的的引入导读。

相关推荐
.似水3 分钟前
2025.4.22_C_可变参数列表
java·c语言·算法
禅与Bug的修复艺术5 分钟前
JAVA后端开发常用的LINUX命令总结
java·linux·面试·java面试·后端开发·java后端·面试经验
佩奇的技术笔记11 分钟前
Java学习手册:Java开发常用的内置工具类包
java
brzhang14 分钟前
代码即图表:dbdiagram.io让数据库建模变得简单高效
前端·后端·架构
Jamesvalley19 分钟前
【Django】新增字段后兼容旧接口 This field is required
后端·python·django
triticale23 分钟前
【蓝桥杯】P12165 [蓝桥杯 2025 省 C/Java A] 最短距离
java·蓝桥杯
Felven23 分钟前
A. Ideal Generator
java·数据结构·算法
你熬夜了吗?29 分钟前
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
服务器·websocket·spring·netty·ssl
秋野酱31 分钟前
基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
JAVA学习通1 小时前
JAVA多线程(8.0)
java·开发语言