Tmiracle

IoC概念

IoC是什么?

IoC全名为Inverse of Control,意思为控制反转

它是Spring容器的内核!!

AOP、声明式事务等功能是建立在IoC的基础上的。

IoC的概念与作用

我们先用图来理解一下,没有使用IoC时类和对象的关系:

如上图所示,我们发现,类和对象的依赖关系非常严重,每次一个类中需要使用一个对象时,都需要在该类中new一个对象实例,代码如下:

public class Obj1 {
    public Obj1(){}
}
public class A {
    private Obj1 obj1 = new Obj1();//A类依赖于对象1
}

众所周知(其实我忘了,查了资料才知道的[捂脸]),每new一个对象都会占用JVM虚拟机的一部分内存空间,如果一个类需要依赖于多个对象,意味着需要new多个对象的实例,这显然不仅关系错综复杂,而且如果某个对象没有被调用时,还很浪费虚拟机的资源。

现在问题来了,由于各种原因,我们要把某个对象替换掉,或者把某个对象删掉,又或者某个类中不再需要依赖某个对象了,请问我们要改多少处代码??很显然,非常的麻烦!

这时候,我们就要用到IoC了:

对象交给IoC去创建后,是不是瞬间感觉清爽了很多?

众所周知(没错,我又去查了资料[滑稽]),IoC容器在全局维持一个对象实例集合和类名集合,我们在写某个类的时候把这个类依赖的对象注册到容器里,当我们需要使用某个对象时,IoC会通过Java的反射机制来找到这个对象并将该对象实例化出来。

public class Obj1 {
    public Obj1(){}
}
public class A {
    @Autowired
    private Obj1 obj1;//相当于setter,已经实例化
}

因为是通过反射机制实例化对象,所以,当类里注入了好几个对象,只要该对象没有被使用,IoC容器就不会去实例化这个对象,并且在完成调用后,还会自动销毁掉对象实例,从而减少虚拟机的资源占用。