通常,我们认为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。