IOC(Inversion of Control )与 DI(Dependency injection)是sping的主要思想,不是技术!
IOC控制反转:一般我们在一个类中调用其它的类(非静态类),需要新建一个该类的实例或者从其他途径获取该类的实例,然后对通过该实例进行操作,例如:
创建一个dept类(当前类)
创建一个employ类(被调用类)
在dept类中调用employ的working方法
package test;
public class dept {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
orderToWork();
}
static void orderToWork()
{
employ em = new employ(20, "Tom", true);
em.working();
}
}
在这种情况下,当前类和所调用的类就会有强耦合,任何对调用类源码的修改都可能会需要修改当前类的代码,这种情况是要极力避免的,为了解决这种情况,采用以下方式
package test;
public class dept {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//在Spring中所需要的对象由容器在需要的时候注入,不是自己new的
//这里先简单的把这也理解为控制反转
orderToWork(new employ(20,"Joke",true));
}
static void orderToWork(employ em)
{
em.working();
}
}
在普通程序中的这种写法并没有使当前类与被调用类接耦(因为被调用的实例类还是在当前类实例化的),但是在Spring框架中,并不需要我们实例化被调用类,只需要在当前类中orderToWork(employ em),然后再配置文件中进行配置,然后在运行的时候由容器本身去创建所需要的对象实例,达到当前类与被调用类的解耦。上面的逻辑太简单,以至于不容易看出控制反转的效果
接下来,假如需要将employ划分的细一些,有高级员工,初级员工,这些工人都继承employ
在dept类中
package test;
public class dept {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//new min_employ(20,"Joke",true)这句话在Spring中只需要写成employ em就行
orderToWork(new min_employ(20,"Joke",true));
}
static void orderToWork(employ em)
{
em.working();
}
}
当因为需求改变,需要增加一个新的员工等级-中级,此时只需要新增一个mid_employ类添加到项目中,不需要改变dept类中的代码,达到当前类dept与被调用类的解耦
为什么叫控制反转呢?因为一般的程序中,被调用类employ是由当前类dept创建,所以dept类具有employ的生死控制权,创建即生,销毁即死,将此种方式称之为正转,Spring中由Spring容器创建被调用类employ的实例,当前类只是被动的接受该实例,这种方式被称为反转,之前被我们成为被调用类employ的实例其实就是dept类所依赖的对象
DI依赖注入,上面描述的过程中,dept类需要employ实例才能正常运行(因为orderToWork方法中需要employ实例调用working方法),所以employ的实例就是dept类的一个依赖,Spring容器在程序运行时,给dept类传入employ实例就是注入
!!!场景模拟
机器人拿枪射击:有几个机器人要各拿一把枪去战场打仗
解析:机器人(当前类),枪放在武器库中(当前类依赖的对象),枪的种类和在武器库中的位置会改变
1.在不使用Spring下,机器人在上战场时需要自己去武器库中选一把枪
2.在使用Spring下,机器人在上战场时由武器库管理员按照该机器人的要求(配置文件中配置的信息)给他发一把枪
对比可以发现在没有控制反转的情况下,武器库发生变动,一旦各个机器人想要的武器位置发生改变,此时需要修改每个机器人在武器库中行走的路径才能拿到相应的武器,但是在控制反转的情况下,每个机器人最开始只需要指定一个固定的位置等待武器库管理员分发武器就行,武器库发生改变,对机器人不造成影响!
武器库管理员就是Spring容器,所有的武器都会在武器库管理员这里注册登记,在需要时,会将你需要的东西主动给你!
这是简单的场景,复杂一点的话,机器人对象也可以是其他类的依赖,比如说坦克需要有机器人驾驶才能上战场,那么Spring容器会将对应的枪交给相应机器人,再把对应的机器人交给相应的坦克,对应的关系,在配置文件中进行配置
这就是Spring中IOC和DI的思想与作用了,枯叶不擅长描述,有描述不当的地方,望见谅!