IOC概念介绍以及简单实现
什么是IOC
百度百科是对于IOC是这么介绍的,控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
需要注意一下两个问题:
1.谁控制谁
2.反转了什么
在没有IOC之前,我们的程序应该是这样的:
Child son = new Child();
当我们需要一个名叫son的Child对象时,我们就会写程序去“new”一个,自己动手丰衣足食,没毛病,这最基本不过。这个例子中,我们或者说我们写的程序“new Child()”控制生成了一个对象,是我们手动new的。
使用IOC之后:
@某注解
Child son;
son.setXXX();
son.setYYY();
相比之前,我们不用手动new了,直接son.setXXX()竟然没有报空指针。也就是说生成一个对象的事情,交给框架去做了。
如果你还不理解这个概念,那就讲个吃货的故事:
你饿了要吃饭,以前要吃鱼要自己拿着菜单跟着做,后来有了外卖平台,自己不用做也有饭吃了,你只要在上面点这道菜,就会帮你做好,送到你家。以前是你自己动手丰衣足食,后面是别人帮你做,这个角色变化,就是对“鱼”的控制由你反转到了别人。类比过来就是,对对象的控制由我们的程序反转到了框架。
IOC使用
我们抽象出一个接口:
public interface CookFish{
void cook();
}
然后会
public class BraiseFish implement CookFish{
@Override
void cook(){
// 红烧
}
}
public class SteamedeFish implement CookFish{
@Override
void cook(){
// 清蒸
}
}
比如有个类A
public class A {
CookFish cookFish = new BraiseFish();
cookFish.cook();
}
对类A做修改
public class A {
//CookFish cookFish = new BraiseFish();
CookFish cookFish = new SteamedeFish();
cookFish.cook();
}
小结:CookFish的生成(new的动作)是由A控制的,而IOC的思想就是,生成CookFish由框架去做。类A只需要关心cook这件事(业务逻辑)就好了,生成鱼的逻辑的都由框架去做。
既然IOC的工作就是框架帮我们生成对象实例,那么就要从java生成对象的几个方法说起:
1.new一个
2.反射
3.反序列化
4.clone
后面两个使用的先决条件是,已经有一个“模版”对象,只有前两个才是从无到有生成,所以思路应该从前两个入手。
1.new 一个,Dagger的IOC方式;
2.反射,Spring 的IOC方式。
了解IOC是什么以后,在借助介绍的使用案例,详细大家都会使用了吧。