Spring框架之控制反转IoC(Inversion of Control)的理解
简单理解:
控制反转就是将代码的调用权(控制权)从调用方转移给被调用方(服务提供方)。
解释一下:
如果我们需要创建某个类,就需要程序员去修改代码,然后才可以得到想要的类。反转的意思就是不需要程序员去直接操作代码,而是通过服务方
(Spring)让框架的机制帮助程序员获得想要的对象,而程序员只需要修改配置文件,不用关心对象是怎么创建的。
举个例子:
1 public class UserServiceImpl implements UserService {
2 private UserDao userDao = new UserDaoImpl();
3 @Override
4 public void getUser() {
5 userDao.getUser();
6 }
7 }
如果 UserDao 接口被多个不同的类实现,那么在service层就要多次修改标蓝色的代码。
比如:增加一个 UserDaoMySqlImpl 类去实现 UserDao 接口
1 public class UserDaoMySqlImpl implements UserDao {
2 @Override
3 public void getUser() {
4 System.out.println("MySql获取用户数据");
5 }
6 }
那么如果在service层需要使用这个类,就要修改代码:
1 public class UserServiceImpl implements UserService {
2 private UserDao userDao = new UserDaoMySqlImpl();
3 @Override
4 public void getUser() {
5 userDao.getUser();
6 }
7 }
如果增加一千个类去实现这个接口,那么代码将被程序员修改一千次,这是很不合理的。
解决方法:
成员变量是UserDao接口类,但是并不去实现它,给一个实现的方法去实现。
1 public class UserServiceImpl implements UserService {
2 private UserDao userDao;
3 // 利用set实现
4 public void setUserDao(UserDao userDao) {
5 this.userDao = userDao;
6 }
7 @Override
8 public void getUser() {
9 userDao.getUser();
10 }
11 }
这样我们在调用不同的实现类的时候就可以这么写代码:
1 UserServiceImpl service = new UserServiceImpl();
2 service.setUserDao( new UserDaoOracleImpl() );
总结:
这也是一种反转,本身如果用户需要使用某一个服务类,需要程序员修改内部代码来实现,
现在程序员只需要给用户提供接口,用户根据需求填入参数就可以得到想要的类。
之前的主动权在程序,在程序员。
现在的主动权在调用者,就是调用 setUserDao( )方法的人,
程序成为了被动者。
这就是通过定义一个方法,以传参数的形式来返回一个类对象,而不用在类内部初始化另一个类,降低了代码的耦合性。
控制反转IoC(Inversion of Control),是一种设计思想,DI(Dependency Injection)依赖注入是实现IoC的一种方法。
反转
是程序和IoC容器的反转
之前如果程序想要获得某个对象,就直接自己主动去创建,主动权在程序。
有了IoC容器之后,
程序获取对象的主动权给了IoC容器,程序成为了被动的接收者,
只需要等待容器去创建对象并接收,不需要去主动修改代码获得对象。
Spring容器是如何实现的?
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
依赖:程序依赖IoC容器
注入:IoC容器帮助程序注入到某个对象需要的外部资源(比如给对象的变量赋值)
参考自:https://blog.csdn.net/jisuanjiguoba/article/details/81532965
https://www.kuangstudy.com/zl/ssm#1381801414325481474
Spring框架之控制反转IoC(Inversion of Control)的理解的更多相关文章
- 【Java_Spring】控制反转IOC(Inversion of Control)
1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的 ...
- Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...
- IOC 控制反转(Inversion of Control,英文缩写为IoC)
在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿 ...
- 控制反转(Inversion of Control,英文缩写为IoC),另外一个名字叫做依赖注入(Dependency Injection,简称DI)
控制反转(Inversion of Control,英文缩写为IoC),另外一个名字叫做依赖注入(Dependency Injection,简称DI),是一个重要的面向对象编程的法则来削减计算机程序的 ...
- Spring 概念及特点 Spring下载地址 控制反转IoC实现原理
Spring下载地址 http://repo.springsource.org/libs-release-local/org/springframework/spring/ Spring是开源full ...
- 控制反转(Inversion of Control)之我的理解
关于控制反转(Inversion of Control),在具体实现上也有许多其它的叫法,如依赖倒置(Dependency Inversion Principles, DIP).依赖注入(Depend ...
- Spring 框架学习—控制反转(IOC)
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建. 简单来说,Spring是一个分层的JavaSE/EEfull-st ...
- spring中的控制反转IoC和依赖注入DI
原文:http://blog.163.com/xianghuxian@126/blog/static/50639037200721345218382/ IoC(Inversion of Control ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- Spring框架使用(控制反转,依赖注入,面向切面AOP)
参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...
随机推荐
- RMAN REPORT NEED BACKUP DAYS 5
47.You issue the following command on the RMAN prompt. REPORT NEED BACKUP DAYS 5; Which statement is ...
- RestTemplate的一些坑和改造点
一.RestTemplate怎么引入和使用 在pom.xml文件中加入如下dependency: <dependency> <groupId>org.springframewo ...
- 【Android 逆向】r0zapataNative.apk 破解
1. apk 安装到手机,需要输入内容,随便输入,提示fail... 2. apk 导入到jadx中查看一下 MainActivity.java String textData = "b2F ...
- BUUCTF [强网杯 2019]随便注 1
1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...
- FastGateway 发布v0.0.0.5
FastGateway 发布v0.0.0.5 修复构建错误 修复docker-compose执行目录 修改请求来源分析数据列表展示 update README.md. 增加默认证书 修复构建脚本目录错 ...
- ContentType组件表使用
https://www.shuzhiduo.com/A/qVdepN2r5P/
- 可视化技术在 Nebula Graph 中的应用
本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...
- ffmpeg 使用记录
这周周末尝试把我硬盘上面的视频文件压缩了一下,但是效果并不理想.其中主要有两个原因, 视频本来就是h264的编码,再重新编码也没啥用,因为限制大小的主要是码率 ffmpeg GPU加速版的h265编码 ...
- win上vscode配置ffmpeg
参考博客https://blog.csdn.net/leixiaohua1020/article/details/38868499 https://blog.csdn.net/weixin_37515 ...
- 详解Python魔法函数,__init__,__str__,__del__
1.简介 Python作为一门灵活而强大的编程语言,提供了许多特殊的方法,被称为魔法函数(Magic methods).这些魔法函数以双下划线开头和结尾,能够让我们自定义类的行为,使得Python更加 ...