JAVA(一)依赖注入的简单理解
所谓依赖,举个例子说明,一个类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(一)依赖注入的简单理解相关推荐
- DI(依赖注入)简单理解 NO1
依赖注入:目的削减程序的耦合度,达到高内聚/低耦合 常用形式:Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等. 通过I ...
- go 依赖注入 哪个好_go与java的依赖注入实现的一些差异
go语言是一门开源的语言,我这里说开源,并不是指go的编译器等是开源,而是指go在机制上决定了当我们引入一个类库的时候,实质上是引入类库的源码. 纯go实现的类库.模块,基本是无法以编译后二进制的形式 ...
- 控制反转(IOC) 和依赖注入(DI) 的理解
1. IOC(控制反转) inverseof control是spring容器的内核,AOP.声明事务等功能在此基础上开花结果. 2. 通过实例理解IOC概念: 实例:<墨攻 ...
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...
- java中依赖注入_关于Java:什么是依赖注入?
本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...
- java的依赖注入_Java依赖注入的三种方式
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:组织方式注入,setter注入,基于注解的注入. 组织方式注入 组织器注入:保证了一些需要的属性在Bean实例化时就设 ...
- Java:annotation注解的简单理解和总结
Java annotation 注解Annotation 1.Annotation的概述 1.1.定义 1.2.Annotation作用分类 1.3.Annotation 架构 2.Annotatio ...
- java p=x,javap的简单理解
? ? ? ? ?java特种兵,深入理解jvm ? ? ? ?了解一些javap的知识. ? 这里列举下我这里接触过的常用指令吧 xconst_n ? ?将常量压入栈顶 ?如iconst_1,将in ...
- WebAPI_AutoFac(依赖注入)的简单使用
控制器:构造函数注入不同类型的实例赋值给其实现的接口类型 public class UserController : ApiController{private IPersons person;//接 ...
最新文章
- BCH为什么要把自身打造成多元化平台
- python读取yuv
- 刚安装了Fedora32,尝尝鲜~,哈哈~~~
- [软件工程基础]结对项目 数独程序扩展
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第四天Header处理
- linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
- 算法思想——贪心(详细举例理解~)
- 小C的数学问题 线段树+分治
- Google 发布首款微信小程序,各种灵魂画作出没!
- EFRCN对应频段号
- 9月第2周网络安全报告:境内87.8万主机感染病毒
- 私有云计算机械硬盘还是固态硬盘,机械硬盘居然也限制写入量,吓得我又买一块固态硬盘...
- directadmin安装
- python 字符串 1.1 从键盘输入10个英文单词,输出其中以元音字母开头的单词。
- 我用python代码表白,泡到了大学小师妹
- linux 动态库文件stripped属性理解(转)
- 儿童退烧药“布洛芬混悬液”真相解密
- 《我是一只IT小小鸟》读书笔记3
- Ubuntu20.04 安装ch340驱动
- 夏季显示服务器,ODCC2020夏季全会—服务器工作组
热门文章
- 温故知新|传感器基础结构与通信原理
- Windows内核安全与驱动编程学习笔记----1.WDK安装
- 升级safari 12版本,easyconnectplugin插件等不能使用解决办法
- 极海APM32F072RB开发环境测试
- 【零成本 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机
- 基于QT的商场线上购物管理系统之客户端
- 基于fpga的直流电机vhdl+论文+开题报告+(csdn免费下载)
- Gif录制工具--Mac篇
- class4/class10/UHS-1/UHS-3 SD卡速度等级区别
- Android使用keytool-importkeypair生成一个系统签名,只要打包的时候使用该签名,便可以获得系统所有权限