版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、Spring启示录阅读以下代码:packagecom.powernode.oa.controller;importcom.powernode.oa.service.UserService;importcom.powernode.oa.service.impl.UserServiceImpl;publicclassUserController{privateUserServiceuserService=newUserServiceImpl();publicvoidlogin(){Stringusername="admin";Stringpassword="123456";booleansuccess=userService.login(username,password);if(success){//登录成功}else{//登录失败}}}packagecom.powernode.oa.service.impl;importcom.powernode.oa.bean.User;importcom.powernode.oa.dao.UserDao;importcom.powernode.oa.dao.impl.UserDaoImplForMySQL;importcom.powernode.oa.service.UserService;publicclassUserServiceImplimplementsUserService{privateUserDaouserDao=newUserDaoImplForMySQL();publicbooleanlogin(Stringusername,Stringpassword){Useruser=userDao.selectByUsernameAndPassword(username,password);if(user!=null){returntrue;}returnfalse;}}packagecom.powernode.oa.service.impl;importcom.powernode.oa.bean.User;importcom.powernode.oa.dao.UserDao;importcom.powernode.oa.dao.impl.UserDaoImplForMySQL;importcom.powernode.oa.service.UserService;publicclassUserServiceImplimplementsUserService{privateUserDaouserDao=newUserDaoImplForMySQL();publicbooleanlogin(Stringusername,Stringpassword){Useruser=userDao.selectByUsernameAndPassword(username,password);if(user!=null){returntrue;}returnfalse;}}可以看出,UserDaoImplForMySQL中主要是连接MySQL数据库进行操作。如果更换到Oracle数据库上,则需要再提供一个UserDaoImplForOracle,如下:packagecom.powernode.oa.dao.impl;importcom.powernode.oa.bean.User;importcom.powernode.oa.dao.UserDao;publicclassUserDaoImplForOracleimplementsUserDao{publicUserselectByUsernameAndPassword(Stringusername,Stringpassword){//连接Oracle数据库,根据用户名和密码查询用户信息returnnull;}}很明显,以上的操作正在进行功能的扩展,添加了一个新的类UserDaoImplForOracle来应付数据库的变化,这里的变化会引起连锁反应吗?当然会,如果想要切换到Oracle数据库上,UserServiceImpl类代码就需要修改,如下:packagecom.powernode.oa.service.impl;importcom.powernode.oa.bean.User;importcom.powernode.oa.dao.UserDao;importcom.powernode.oa.dao.impl.UserDaoImplForOracle;importcom.powernode.oa.service.UserService;publicclassUserServiceImplimplementsUserService{//privateUserDaouserDao=newUserDaoImplForMySQL();privateUserDaouserDao=newUserDaoImplForOracle();publicbooleanlogin(Stringusername,Stringpassword){Useruser=userDao.selectByUsernameAndPassword(username,password);if(user!=null){returntrue;}returnfalse;}}1.1OCP开闭原则这样一来就违背了开闭原则OCP。开闭原则是这样说的:在软件开发过程中应当对扩展开放,对修改关闭。也就是说,如果在进行功能扩展的时候,添加额外的类是没问题的,但因为功能扩展而修改之前运行正常的程序,这是忌讳的,不被允许的。因为一旦修改之前运行正常的程序,就会导致项目整体要进行全方位的重新测试。这是相当麻烦的过程。导致以上问题的主要原因是:代码和代码之间的耦合度太高。如下图所示:可以很明显的看出,上层是依赖下层的。UserController依赖UserServiceImpl,而UserServiceImpl依赖UserDaoImplForMySQL,这样就会导致下面只要改动,上面必然会受牵连(跟着也会改),所谓牵一发而动全身。这样也就同时违背了另一个开发原则:依赖倒置原则。1.2依赖倒置原则DIP依赖倒置原则(DependenceInversionPrinciple),简称DIP,主要倡导面向抽象编程,面向接口编程,不要面向具体编程,让上层不再依赖下层,下面改动了,上面的代码不会受到牵连。这样可以大大降低程序的耦合度,耦合度低了,扩展力就强了,同时代码复用性也会增强。(软件七大开发原则都是在为解耦合服务)你可能会说,上面的代码已经面向接口编程了呀:确实已经面向接口编程了,但对象的创建是:newUserDaoImplForOracle()显然并没有完全面向接口编程,还是使用到了具体的接口实现类。什么叫做完全面向接口编程?什么叫做完全符合依赖倒置原则呢?请看以下代码:如果代码是这样编写的,才算是完全面向接口编程,才符合依赖倒置原则。那你可能会问,这样userDao是null,在执行的时候就会出现空指针异常呀。你说的有道理,确实是这样的,所以我们要解决这个问题。解决空指针异常的问题,其实就是解决两个核心的问题:第一个问题:谁来负责对象的创建。【也就是说谁来:newUserDaoImplForOracle()/newUserDaoImplForMySQL()】第二个问题:谁来负责把创建的对象赋到这个属性上。【也就是说谁来把上面创建的对象赋给userDao属性】如果我们把以上两个核心问题解决了,就可以做到既符合OCP开闭原则,又符合依赖倒置原则。很荣幸的通知你:Spring框架可以做到。在Spring框架中,它可以帮助我们new对象,并且它还可以将new出来的对象赋到属性上。换句话说,Spring框架可以帮助我们创建对象,并且可以帮助我们维护对象和对象之间的关系。比如:Spring可以new出来UserDaoImplForMySQL对象,也可以new出来UserDaoImplForOracle对象,并且还可以让new出来的dao对象和service对象产生关系(产生关系其实本质上就是给属性赋值)。很显然,这种方式是将对象的创建权/管理权交出去了,不再使用硬编码的方式了。同时也把对象关系的管理权交出去了,也不再使用硬编码的方式了。像这种把对象的创建权交出去,把对象关系的管理权交出去,被称为控制反转。1.3控制反转IoC控制反转(InversionofControl,缩写为IoC),是面向对象编程中的一种设计思想,可以用来降低代码之间的耦合度,符合依赖倒置原则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校安全卫生工作应急处理预案汇编模板
- 中医胸痹的日常护理方法
- 春季预防传染疾病与防治专题讲座模板
- 华新物业营销方案(3篇)
- 广州新型应急预案(3篇)
- 促销活动套装方案策划(3篇)
- 保暖毯应急预案(3篇)
- 咖啡车展活动策划方案(3篇)
- 惠州大学活动策划方案(3篇)
- 排队餐厅营销方案(3篇)
- AQ 1017-2005 煤矿井下安全标志(正式版)
- JTG 3432-2024 公路工程集料试验规程(正式版)
- 呼吸科咯血教学查房
- 联芳园区规划小学新建工程项目
- 商铺租赁合同模板协议书
- 同等学力申硕英语大纲词汇(第六版)
- GB/T 26655-2022蠕墨铸铁件
- 骨肿瘤―影像诊断及鉴别课件
- 消防设施基础知识培训教材课件
- SY∕T 7298-2016 陆上石油天然气开采钻井废物处置污染控制技术要求
- 劳动法全套课件
评论
0/150
提交评论