所谓依赖,举个例子说明,一个类Person,另一个类Car,如果Person的某个方法比如说drive,需要引用Car,则称Person类依赖于 Car类,延伸到对象,这种依赖关系依然成立,比如说Person类的对象boy依赖于Car类的对象toyota。再讲讲这个drive方法的实现,假定代码如下:

Public Person{
...
public void drive(){Car toyota=new Car("TOYOTA");toyota.挂档;toyota.踩油门;toyota.打方向;
}
}

这其中的依赖关系,就导致了对象boy需要负责对象toyota的创建,甚至是整个生命周期的管理,而这样显然会带来耦合度高,不易维护等缺点,比如说要让这个男孩驾驶一辆Audi,则还需要修改类Person的代码。
    因此在java的设计理论中就提出了一条非常著名的原则,依赖倒转原则(Dependence Inversion),其核心思想就是要将这种具体类之间的依赖,尽量转换成抽象依赖,也就是说类Person应该依赖于抽象类ICar,而不是具体的类 Car,这里java就大力推荐了抽象和接口的使用,至于抽象和接口之间的区别,任何一本JAVA书籍都有介绍,这里就不再说了。

这个依赖倒转原则在设计模式也体现得非常多,比如说工厂模式和构建模式,个人认为控制反转IoC,其实也可以认为是实现这个原则的一种设计模式。控制反转,其中的控制这个词一直不太理解是什么意思,不过控制反转的另外一种说法也就是依赖注入(dependence injection),个人觉得更易于理解。还是以上文的boy与toyota为例,其核心就是要将boy依赖的对象toyota注入到boy中去,而无需boy自己去引用toyota,这个注入的过程,通常是由一个控制程序来完成的,无需对象去关心,举例如下:

Public Person{
private ICar car;
public Person(ICar onecar){car=onecar;
}
public void drive(){car.挂档;car.踩油门;car.打方向;
}
}

这个时候,进行注入并且调用的过程,就很简单了,如下:

Toyota toyota=new Toyota();
Person boy=new Person(toyota);
boy.drive();

注:这里我们假定,Toyota类是ICar接口类的一个具体实现。
    这个例子就演示一个最简单的注入方式的例子,也就是构造子方式注入,通过将依赖对象注入到对象的构造子中来实现。另外还有一种常用的注入方式,就是属性方式注入,意思就是通过将依赖对象注入到对象的属性中来实现,还是以boy和toyota的例子说明,如下:

Public Person{
private ICar car;
public Person(){
}
public void drive(){car.挂档;car.踩油门;car.打方向;
}
public ICar getCar(){return this.car;
}
public void setCar(ICar onecar){car=onecar;
}
}
 这个时候,进行注入并且调用的过程,就变成如下所示:
Toyota toyota=new Toyota();
Person boy=new Person();
boy.setCar(toyota);
boy.drive();

至此依赖注入的概念应该比较清楚了,再来看看在Spring中如何实现IoC的,看看Spring如何作为一个成熟的IoC容器,Spring中其实主要通过两个概念来实现IoC,首先通过XML配置文件,将对象和依赖对象都配置到某个XML文件中,当然该XML文件需要符合Spring指定的规范,然后通过架构中的BeanFactroy类,来自动实现上文所述注入过程,还是以boy与toyota为例,如下:
首先,Person类还是一样的,
    然后xml配置文件增加点东西-(假定为bean.xml):

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans><bean id="oneCar" class="Toyota"> <!-- Toyota类是ICar的一个实现--></bean><bean id="onePerson" class="Person"> <!--本例以属性方式注入为例 --><property name="car"> <ref bean="oneCar"></ref></property></bean>
</beans>
  最后,调用的过程,就变成如下:
BeanFactory factory=new XmlBeanFactory("bean.xml");
Person boy=(Person )factory.getBean("onePerson");
boy.drive();

A类和B类,如果A要用到B,在A类中加一个setB()就OK了,再通过spring的IOC容器实例化好的对象用属性注入就OK了

JAVA(一)依赖注入的简单理解相关推荐

  1. DI(依赖注入)简单理解 NO1

    依赖注入:目的削减程序的耦合度,达到高内聚/低耦合 常用形式:Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等. 通过I ...

  2. go 依赖注入 哪个好_go与java的依赖注入实现的一些差异

    go语言是一门开源的语言,我这里说开源,并不是指go的编译器等是开源,而是指go在机制上决定了当我们引入一个类库的时候,实质上是引入类库的源码. 纯go实现的类库.模块,基本是无法以编译后二进制的形式 ...

  3. 控制反转(IOC) 和依赖注入(DI) 的理解

    1.      IOC(控制反转) inverseof control是spring容器的内核,AOP.声明事务等功能在此基础上开花结果. 2.      通过实例理解IOC概念: 实例:<墨攻 ...

  4. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...

    简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...

  5. java中依赖注入_关于Java:什么是依赖注入?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...

  6. java的依赖注入_Java依赖注入的三种方式

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:组织方式注入,setter注入,基于注解的注入. 组织方式注入 组织器注入:保证了一些需要的属性在Bean实例化时就设 ...

  7. Java:annotation注解的简单理解和总结

    Java annotation 注解Annotation 1.Annotation的概述 1.1.定义 1.2.Annotation作用分类 1.3.Annotation 架构 2.Annotatio ...

  8. java p=x,javap的简单理解

    ? ? ? ? ?java特种兵,深入理解jvm ? ? ? ?了解一些javap的知识. ? 这里列举下我这里接触过的常用指令吧 xconst_n ? ?将常量压入栈顶 ?如iconst_1,将in ...

  9. WebAPI_AutoFac(依赖注入)的简单使用

    控制器:构造函数注入不同类型的实例赋值给其实现的接口类型 public class UserController : ApiController{private IPersons person;//接 ...

最新文章

  1. BCH为什么要把自身打造成多元化平台
  2. python读取yuv
  3. 刚安装了Fedora32,尝尝鲜~,哈哈~~~
  4. [软件工程基础]结对项目 数独程序扩展
  5. 学习响应式BootStrap来写融职教育网站,Bootsrtap第四天Header处理
  6. linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
  7. 算法思想——贪心(详细举例理解~)
  8. 小C的数学问题 线段树+分治
  9. Google 发布首款微信小程序,各种灵魂画作出没!
  10. EFRCN对应频段号
  11. 9月第2周网络安全报告:境内87.8万主机感染病毒
  12. 私有云计算机械硬盘还是固态硬盘,机械硬盘居然也限制写入量,吓得我又买一块固态硬盘...
  13. directadmin安装
  14. python 字符串 1.1 从键盘输入10个英文单词,输出其中以元音字母开头的单词。
  15. 我用python代码表白,泡到了大学小师妹
  16. linux 动态库文件stripped属性理解(转)
  17. 儿童退烧药“布洛芬混悬液”真相解密
  18. 《我是一只IT小小鸟》读书笔记3
  19. Ubuntu20.04 安装ch340驱动
  20. 夏季显示服务器,ODCC2020夏季全会—服务器工作组

热门文章

  1. 温故知新|传感器基础结构与通信原理
  2. Windows内核安全与驱动编程学习笔记----1.WDK安装
  3. 升级safari 12版本,easyconnectplugin插件等不能使用解决办法
  4. 极海APM32F072RB开发环境测试
  5. 【零成本 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机
  6. 基于QT的商场线上购物管理系统之客户端
  7. 基于fpga的直流电机vhdl+论文+开题报告+(csdn免费下载)
  8. Gif录制工具--Mac篇
  9. class4/class10/UHS-1/UHS-3 SD卡速度等级区别
  10. Android使用keytool-importkeypair生成一个系统签名,只要打包的时候使用该签名,便可以获得系统所有权限