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数据库。
于是我们的步骤为:
- 写一个调用oracle数据库的dao层实现类
- 修改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框架的的引入导读。