控制反转 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 理论推导的更多相关文章

  1. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

  2. Spring-简介-IOC理论推导

    1.Spring 1.1.简介 Spring:春天----->给软件行业带来了春天! 2002,首次推出了Spring框架的雏形:interface21框架! Spring框架即以interfa ...

  3. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  4. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  5. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  6. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  7. 控制反转IoC简介

    控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...

  8. 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路

    开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...

  9. 控制反转IOC的依赖注入方式

    引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...

随机推荐

  1. DOS命令基础

    DOS命令 打开CMD win+R,输入cmd. 桌面任何地方按住shift+鼠标右键 ,点击powershell. 我的电脑文件路径前cmd+空格. 开始+系统. 关闭CMD alt+空格+C. 常 ...

  2. WPF 文本描边+外发光效果实现

    解决思路: (1)描边效果可以将文本字符串用GDI+生成Bitmap,然后转成BitmapImage,再用WPF的Image控件显示. (2)外发光效果用WPF自带的Effect实现 代码: 1 us ...

  3. CentOS7 MySql数据库安装配置(单实例)

    一. 安装mysql-server 官网下载安装 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # ...

  4. Android 12(S) 图形显示系统 - BufferQueue的工作流程(十一)

    题外话 我竟然已经写了这个系列的十一篇文章了,虽然内容很浅显,虽然内容很枯燥,虽然内容也许没营养,但我为自己的坚持点赞! 一.前言 前面的两篇文章,分别讲解了Producer的处理逻辑和queue b ...

  5. Ubuntu20.04服务器+Anaconda上创建Python3.6虚拟环境并

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 前言 由于服务器已安装Anaconda,包含的Python版本为3.8,为使用3.6版本同时避免和其他人互相影响,我选择创建虚拟环境,并在其中安 ...

  6. Linux服务器上搭建Centos7.0+Apache+php+Mysql网站

    一.安装Linux系统 1.1虚拟机搭建Linux Centos7.0版本,搭建过程省略. 二. 安装apache.php.mysql.php-gd等组件. 2.1安装Apache服务程序(apach ...

  7. [转载]从phpinfo中能获取哪些敏感信息

    phpinfo()想必的最熟悉的了,在搭建环境之后都会随后写一个 phpinfo()来测试环境是否正常,很多人测试完毕忘记删除就开始部署环境了,这就造成了一些敏感信息的泄漏.那么我们能从 phpinf ...

  8. 10年.NET老程序员推荐的7个开发类工具

    做.NET软件工作已经10年了,从程序员做 到高级程序员,再到技术主管,技术总监.见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio ...

  9. Mycat 数据切分 看这一篇就够了

    数据切分 ​ 数据切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果. ​ 数据的切分根据其切分规则的类型,可以分为两种切分模式.一种 ...

  10. 一文看懂:ChIP实验和qPCR定量分析怎么做|易基因技术

    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因. 染色质免疫共沉淀(Chromatin Immunoprecipitation,ChIP),是研究体内蛋白质与DNA相互作用的经典方法. ...