当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-谈谈你对IOC的理解

金三银四精选java面试题-谈谈你对IOC的理解

来源:图灵教育
时间:2023-12-14 09:19:07
 

谈谈你对IOC的理解

 

通常,我们认为Spring有两大特性IoC和AOP,那到底该如何理解IoC呢?

 

对于很多初学者来说,IoC这个概念给人的感觉就是我好像会,但是我说不出来

 

那么IoC到底是什么,接下来来说说我的理解,实际上这是一个非常大的问题,所以我们就把它拆细了来回答,IoC表示控制反转,那么:

  1. 什么是控制?控制了什么?
  2. 什么是反转?反转之前是谁控制的?反转之后是谁控制的?如何控制的?
  3. 为什么要反转?反转之前有什么问题?反转之后有什么好处?

 

这就是解决这一类大问题的思路,大而化小。

 

那么,我们先来解决第一个问题:什么是控制?控制了什么?

我们在用Spring的时候,我们需要做什么:

  1. 建一些类,比如UserService、OrderService
  2. 用一些注解,比如@Autowired

 

但是,我们也知道,当程序运行时,用的是具体的UserService对象、OrderService对象,那这些对象是什么时候创建的?谁创建的?包括对象里的属性是什么时候赋的值?谁赋的?所有这些都是我们程序员做的,以为我们只是写了类而已,所有的这些都是Spring做的,它才是幕后黑手。

 

这就是控制

  1. 控制对象的创建
  2. 控制对象内属性的赋值

 

如果我们不用Spring,那我们得自己来做这两件事,反过来,我们用Spring,这两件事情就不用我们做了,我们要做的仅仅是定义类,以及定义哪些属性需要Spring来赋值(比如某个属性上加@Autowired),而这其实就是第二个问题的答案,这就是反转,表示一种对象控制权的转移。

 

那反转有什么用,为什么要反转?

 

如果我们自己来负责创建对象,自己来给对象中的属性赋值,会出现什么情况?

 

比如,现在有三个类:

  1. A类,A类里有一个属性C c;
  2. B类,B类里也有一个属性C c;
  3. C类

 

现在程序要运行,这三个类的对象都需要创建出来,并且相应的属性都需要有值,那么除开定义这三个类之外,我们还得写:

  1. A a = new A();
  2. B b = new B();
  3. C c = new C();
  4. a.c = c;
  5. b.c = c;

 

这五行代码是不用Spring的情况下多出来的代码,而且,如果类在多一些,类中的属性在多一些,那相应的代码会更多,而且代码会更复杂。所以我们可以发现,我们自己来控制比交给Spring来控制,我们的代码量以及代码复杂度是要高很多的,反言之,将对象交给Spring来控制,减轻了程序员的负担。

 

总结一下,IoC表示控制反转,表示如果用Spring,那么Spring会负责来创建对象,以及给对象内的属性赋值,也就是如果用Spring,那么对象的控制权会转交给Spring。