从实现来看 , IoC是把以前在工厂方法里写死的对象生成代码 , 改变为由XML文件来定义 , 也就是把工厂和对象生成这两者独立分隔开来 , 目的就是提高灵活性和可维护性 。IoC中最基本的Java技术就是“反射”编程 。
反射又是一个生涩的名词 , 通俗的说反射就是根据给出的类名(字符串)来生成对象 。这种编程方式可以让对象在生成时才决定要生成哪一种对象 。
反射的应用是很广泛的 , 象Hibernate、Spring中都是用“反射”做为最基本的技术手段 。在过去 , 反射编程方式相对于正常的对象生成方式要慢10几倍 , 这也许也是当时为什么反射技术没有普通应用开来的原因 。
但经SUN改良优化后 , 反射方式生成对象和通常对象生成方式 , 速度已经相差不大了(但依然有一倍以上的差距) 。编辑本段IoC的优点和缺点 IoC最大的好处是什么?因为把对象生成放在了XML里定义 , 所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的) , 只要修改XML就可以了 , 这样我们甚至可以实现对象的热插拨(有点象USB接口和SCIS硬盘了) 。
IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(其实上操作上还是挺简单的) , 对于不习惯这种方式的人 , 会觉得有些别扭和不直观 。(2)对象生成因为是使用反射编程 , 在效率上有些损耗 。
但相对于IoC提高的维护性和灵活性来说 , 这点损耗是微不足道的 , 除非某对象的生成对效率要求特别高 。(3)缺少IDE重构操作的支持 , 如果在Eclipse要对类改名 , 那么你还需要去XML文件里手工去改了 , 这似乎是所有XML方式的缺憾所在 。
编辑本段 。
2.依赖注入这个词怎么理解个例子 , 组件A中有类ClassA , 组件B中有接口IB和其对应的实现类B1和B2 。
那么 , 现在ClassA需要利用IB接口来做一些事情 , 例如:
public class ClassA {
public void DoSomething() {
IB b = ???
b.DoWork();
}
}
现在的问题来了 , IB b = ??? 中这三个???要写什么代码?是要写成 IB b = new B1() , 还是要写成IB b = new B2() ?
不管是哪一种 , 都会让ClassA强依赖于IB的实现 。
在上面这种方案中 , ClassA通过new一个B1或B2来实现对IB的依赖的获取 , 换句话说 , ClassA在主动获取依赖 。
这样的设计会让ClassA很难扩展 , 那我们要改良设计:使用依赖注入 。上面说到了 , 问题出在new这里 , 也就是依赖是Class去主动获取的 , 那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new) , 而让这个依赖从ClassA的外面“注入”进来 。注入有多种方式 , 比较常用的一种是通过构造函数注入 , 那么 , 我们要把ClassA改成:
public class ClassA {
private IB b;
public ClassA(IB b) {
this.b = b;
}
public DoSomething() {
this.b.DoWork();
}
}
可以看到 , 通过把IB这个依赖从构造函数中“注”进来后 , ClassA就不依赖IB的实现了 。还可以发现 , 这个重构过程中 , 我们是把"ClassA主动获取对IB的依赖”变成“把对IB的依赖从外部注入到ClassA中” , 依赖的方向反转了 , 所以 , 依赖注入又称“控制反转” 。
- 致他翻译英文怎么写
- 双儿的韩文怎么写
- 工作状态详细的怎么写
- 大院出租合同怎么写
- 艾拉用英文怎么写
- sponsorletter怎么写
- low的音标怎么写
- 公司制定目标怎么写
- 怎么写课文段落大意
- 用电申请村委会意见怎么写