控制反转 IOC 理论推导
控制反转 IOC 理论推导
按照我们传统的开发,我们会先去 dao 层创建一个接口,在接口中定义方法。
public interface UserDao {
void getUser();
}
然后再去实现类中实现这个方法的作用。
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
然后再去 service 层写一个接口,在接口中定义方法。
public interface UserService {
void getUser();
}
再然后写实现类,实现里面的方法。
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
然后我们使用这业务类
public class MyTest {
public static void main(String[] args) {
// 用户实际调用的是业务层,dao 层他们不需要接触
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
最后会输出
默认获取用户的数据
但是现在在 dao 层新增加了一个实现,例如 UserDaomySql
public class UserDaoMysql implements UserDao {
@Override
public void getUser() {
System.out.println("从 MySQL 中获取数据");
}
}
如果我们想要从 UserDaoMysql 这个类中调用 getUser() 这个方法,就需要在 UserServiceImpl 这个类中修改代码,将创建的 UserDaoImpl 改为 UserMysqlImpl 这个对象。然后才能得到我们想要的效果。
从 MySQL 中获取数据
如果用户就像产品经理一样,今天要你想要在 UserDaoImpl 这个对象中获取数据,明天就想要从 UserDaoMysql 这个对象中获取数据呢?
我们面对这样的问题,是不是还要每次去修改代码,如果我们在很多地方创建了这个对象,岂不是要到处修改,或者有更多的实现类,产品经理又突然叫我们用另一个对象,这样我们就会被折磨死。是吧!
我们都知道猴子的脸说变就变,产品经理何尝不是?
那么我们可以不可以这样做,我们就吧选择权交给产品经理,我们不按照我们的意愿去创建这个对象,我们将这个问题抛给产品经理,诶,我不建,我让他去选,他喜欢用哪个,那就创建哪个。
我们来看看我们在 UserServiceImpl 中创建对象的那条语句
private UserDao userDao = new UserDaoImpl();
我想聪明的你,看到这条语句你就很快能明白,这个不就是定义一个对象变量,然后创建一个对象,将其赋值给它。
那么我们可不可以想个办法,让他动态的将这个对象注入到这个变量里面呢?
聪明的你仔细想想,想想我们创建实体类的时候。
嘿嘿!!!
是不是想到了什么。
我们创建实体类的时候,是不是一开始我们没有为那个变量赋值,是后面才用 Set 赋值的吧。
所以是不是想到该怎么做了,嘿嘿嘿
没错,我们就是写个 Setter
private UserDao userDao;
/**
* 利用 Set 进行动态实现值的注入
* @param userDao dao 层的对象
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
我写的和你想的一样吗?我想是的吧。
然后我们使用它
public class MyTest {
public static void main(String[] args) {
// 用户实际调用的是业务层,dao 层他们不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysql());
userService.getUser();
}
}
这样我们是不是就可以随便产品经理怎么想了,他爱用啥用啥,让他自己选一个创建就好了。
这样我们是不是就实现了反转,诶,我不创建对象,让你来选,你喜欢哪一个,就用哪一个。
控制反转 IOC 理论推导的更多相关文章
- 控制反转IOC与依赖注入DI - 理论篇
学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...
- Spring-简介-IOC理论推导
1.Spring 1.1.简介 Spring:春天----->给软件行业带来了春天! 2002,首次推出了Spring框架的雏形:interface21框架! Spring框架即以interfa ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...
- 控制反转IOC与依赖注入DI【转】
转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...
- PHP依赖注入(DI)和控制反转(IoC)详解
这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- 控制反转IoC简介
控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...
- 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路
开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...
- 控制反转IOC的依赖注入方式
引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...
随机推荐
- 移动APP开发框架盘点2:Web移动前端框架大全
前言 自上次发布了<移动APP开发框架盘点>后,时间已经过去了三年, 为什么突然又写一篇续集呢?是因为有一个非常有意思的发现. 开源项目其实有一个成熟周期,这个周期大概是三年左右,自Rea ...
- FLask插件
Flask插件 flask-session 下载 pip install Flask-session 导入 from flask_session import Session 实例化session 在 ...
- 6月11日 python复习 mysql
01. 列举常见的关系型数据库和非关系型都有那些? 1.关系型数据库通过外键关联来建立表与表之间的关系,---------常见的有:SQLite.Oracle.mysql 2.非关系型数据库通常指数据 ...
- 6月6日 python复习 面向对象
1.面向对象编程 1.面向过程编程核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问题 ...
- async-validator 源码学习笔记(四):validator
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 3.async-validator 源码学习笔记(三):ru ...
- Python 的排序方法 sort 和 sorted 的区别
使用 sort() 或内建函数 sorted() 对列表进行排序.它们之间的区别有两点: sort() 方法是对原列表进行操作,而 sorted() 方法会返回一个新列表,不是在原来的基础上进行操作. ...
- 细说MVC框架的几大困惑:
--千万不要为了学习框架而学习框架,而是要为了解决问题而学习框架,这才是一个程序员的正确学习之道. --框架是为了解决一个又一个在Web开发中所遇到的问题而诞生的.不同的框架,都是为了解决不同的问题, ...
- Delaunay三角剖分及MATLAB实例
https://blog.csdn.net/piaoxuezhong/article/details/68065170 一.原理部分 点集的三角剖分(Triangulation),对数值分析(如有限元 ...
- 记-beego项目调用Jenkins API获取job信息
type JenkinsController struct { beego.Controller } type Job struct { Name string `json:"name&qu ...
- 二叉树,红黑树,B+树
在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择.有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除.但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低. ...