Spring IOC(控制反转)思想笔记
IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码。

在这里插入图片描述

案例
如果按照之前javaweb的固定方法,写一个简单的业务逻辑

一个DAO接口

public interface UserDao {
public void getUser();
}
1
2
3
实现DAO接口

public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println(“获取用户数据”);
}
}
1
2
3
4
5
6
一个service接口

public interface UserService {
public void getUser();
}
1
2
3
实现service接口

public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();

@Override
public void getUser() {userDao.getUser();
}

}
1
2
3
4
5
6
7
8
测试类

@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
1
2
3
4
5
这些是原来方式编写的基本步骤,如果现在增加需求,在UserServiceImpl中不是需要UserDaoImpl,而是一个新的实现了UserDao接口的UserDaoMySqlImpl

新增UserDaoMySqlImpl实现UserDao接口

public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println(“MySql获取用户数据”);
}
}
1
2
3
4
5
6
如果要去使用这个UserDaoMySqlImpl的话,就需要在UserServiceImpl中修改代码

修改UserServiceImpl

public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();//修改部分

@Override
public void getUser() {userDao.getUser();
}

}
1
2
3
4
5
6
7
8
如果再增加一个UserDaoOracleImpl

public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println(“Oracle获取用户数据”);
}
}
1
2
3
4
5
6
如果又要使用这个dao,则又需要去service中改变代码,假设项目十分庞大,修改一个dao可能涉及几十几百行代码,我们的工作量就会非常大,程序耦合性也非常高。

如何解决问题
在UserServiceImpl中增加一个set方法

public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set方法,让调用者自行选择需要的dao
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}

@Override
public void getUser() {userDao.getUser();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
新的测试类
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );//自行选择UserDaoMySqlImpl
service.getUser();
//如果又要用UserDaoOracleImpl,也是可以由调用者自行选择
//service.setUserDao( new UserDaoOracleImpl() );
//service.getUser();
}
1
2
3
4
5
6
7
8
9
之前所有的改变都是有程序员去控制,现在将改变的主动权交给了调用者/用户,程序也不用去管怎么创建和调用了,使得程序员可以专心实现业务,只实现一个提供服务的接口,不再管理对象的创建,也降低了代码之间的耦合度,当需求改变时也不必修改大量代码

IOC思想
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。

控制反转:可以理解为控制 对象创建 的 主动权 反转了。原来对象创建要由我们编写的程序控制,主动权在程序手里,控制反转后就将创建对象的主动权移交给第三方,这样可以降低程序代码间的耦合性,减少了修改代码的工作量。

img

img

img

在Spring中,IOC思想的体现就是依赖注入,在xml文件中或者使用注解创建对象交由IOC容器管理,之后获取对象就不再通过new 对象,而是通过配置文件从IOC容器中获取对象,之后修改就不需要改动程序,而只需要在xml配置文件中进行修改 ,将对象交由Spring去创建、管理、装配。

Spring IOC(控制反转)思想笔记相关推荐

  1. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...

  2. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  3. spring ioc控制反转

    一. 什么是spring,它能够做什么? Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能 ...

  4. Spring IOC(控制反转)详解及示例

    控制反转--Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...

  5. spring——IOC控制反转(一)

    一.spring之IOC 1. IOC(控制反转:Inverse of Control ),又称作DI依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的 Spring 框 ...

  6. 详解spring的IOC控制反转和DI依赖注入

    转载 详解spring的IOC控制反转和DI依赖注入 2018-06-05 15:45:34 jiuqijack 阅读数 2945 文章标签: spring IOC控制反转 DI依赖注入 更多 分类专 ...

  7. spring学习笔记 -- day02 spring基础、IOC控制反转

    一:srping的介绍 1.spring的体系结构 2.spring资源 a.spring-framework-4.2.4.RELEASE:Spring Framework的官方发行包 b.sprin ...

  8. 浅谈spring之IoC控制反转

    以下学习资料来源于b站动力节点 spring: 出现是在2002左右,解决企业开发的难度.减轻对项目模块之间的管理,类和类之间的管理, 帮助开发人员创建对象,管理对象之间的关系.spring核心技术 ...

  9. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

最新文章

  1. 收藏 | 图解Transformer:Attention Is All You Need
  2. python增删改查人名管理_python3字典列表的增删改查(名片管理系统函数版)
  3. ZooKeeper典型应用场景一览
  4. 从商业视角理解数据:数据科学家的思维之路
  5. 精彩回顾丨神策 2020 数据驱动用户大会亮点汇总
  6. 在vs2012下编译出现Msvcp120d.dll 丢失的问题
  7. 虚拟桌面启动后自动全屏
  8. mysql to char 用法_postgresql 中的to_char()常用操作
  9. Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)
  10. Windows学习总结(19)——Windows必备神器Cmder使用教程
  11. 用Windows XP自带的性能监视器测试瑞星2010性能(转)
  12. hbase中的master启动后自动关闭
  13. Python学习之表的数据类型
  14. 平面、柱面、球面投影
  15. 网上英语学习资源大整理
  16. java 实现短信验证码功能
  17. python爬取12306火车票信息_python利用selenium+requests+beautifulsoup爬取12306火车票信息...
  18. 优矿-python计算上证50之间的相关系数
  19. Method threw ‘java.lang.UnsupportedOperationException‘ exception.
  20. android导入库项目,如何在android studio项目中导入开源库?

热门文章

  1. 学位论文多级标题编号与图表编号
  2. 编译原理pl/0 c语言版 pl0.h文件
  3. vuejs对象更新渲染_vue 数组和对象渲染问题
  4. cocos2dx java 乱码_[cocos2d-x] --- 完美解决中文乱码
  5. 设置按峰值带宽计费_云平台界面优化升级!VPC网络包年包月计费调整!
  6. mysql数据库查询源码_超简单php mysql数据库查询类
  7. sop4封装尺寸图_「光电封装」 有源光器件的结构和封装
  8. vb.net 判断是否为ip 正则_什么是个人IP科学定位?标准答案来了|ip|直播|科学|ip魔方...
  9. mysql不显示默认密码_免安装版mysql不出现默认密码状况(基于mysql8.0)
  10. whoosh mysql_使用WhooshAlchemy报错'function' object has no attribute 'config'