分层解耦-分层解耦(IOC-DI引入)
- 尽可能解除耦合:
-
解除耦合:就不能new Service层的实现类了
-
要运行上述这个代码会报错的,那是因为你声明了一个变量,并没有给这个变量赋值,那么它的值就是null,会报空指针异常。
-
怎么解决这个问题呢?
-
我们的思路是这样的:我们可以提供一个容器,容器就是用来存东西的,在这里呢我们可以来存一些对象,那假如来说我们想用的EmpServiceA这个实现类,我们只需要把EmpServiceA这个类所创建出来的对象放进容器里,那么接下来我们Controller程序运行的时候需要依赖于EmpService,那么此时我们就可以到容器中去查找EmpService这个类型的对象,那我们看到A对象就是EmpService类型的对象。那么这个时候就可以从容器中找到这个对象,接下来再把这个对象赋值给EmpService。
-
这个时候我们要切换实现类把A切换成B,此时呢我们就可以基于B这个实现类创建一个对象放在容器里,而此时Controller在运行的时候它也需要一个EmpService类型的对象,而此时它可以去容器查找这个对象,去看一下容器中是否有一个EmpService类型的对象,那么B就是这个类型的,就会从容器找到这个对象。然后再赋值给这个变量。这样呢就算Service层发生变化了,Controller层的代码也不用改变,这样就完成了解耦。
- 这里存在两个问题:1.这个对象怎么交给容器管理。2.容器为我们的程序提供它所依赖的资源。