一、理论
所谓 IOC ,就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系
二、IOC能做什么
IOC不是一种技术,而是一种设计思想。
它最关键的作用是解耦,很好的体现了面向对象法则----好莱坞法则"别找我们,我们来找你!",这里得我们就是,Spring IOC容器。
三、理解IOC
谁控制了谁?控制了什么?
谁控制了谁?传统的Java应用程序,我们直接在对象内部通过new去主动获取对象;而IOC是有专门的容器去控制对象的创建,所以是IOC控制了对象。
控制了什么?控制对象。
为何是反转,反转了什么?
IOC之前,对象通过主动创建所要依赖的对象,是正转;而反转是由容器创建及注入依赖对象;
为何是反转?对象的获取从主动变成了被动
反转了什么?对象的获取方式被反转了
四、从例子里看
拆迁办为小张分配一套拆迁房,并录入拆迁系统,很简单
1. 查到小张这个人
2. 校验小张这个人是否在拆迁名单里及是否可以拿房
3. 分配!
IOC之前伪代码如下:
package com.example.demo.controller; /** * IOC之前 * * @author mdl * @date 2020/3/13 15:54 */ public class Client { /** * 拆迁分房 * * @param args */ public static void main(String[] args) { // 1. 查询小张 UserService userService = new UserService(); User xiaoZhang = userService.queryBy("小张"); // 2.拆迁办分房 ChaiQianBanService chaiQianBanService = new ChaiQianBanService(); chaiQianBanService.allocateHouse(xiaoZhang); } class ChaiQianBanService { private UserService userService; private ChaiQianBanDao chaiQianBanDao; public ChaiQianBanService() { } public void allocateHouse(User user) { // 3. 校验 userService = new UserService(); boolean isSuccess =checkUser(user); if(isSuccess){ // 分配 chaiQianBanDao = new ChaiQianBanDao(); chaiQianBanDao.allocateHouseToUser(user); } } public boolean checkUser(User user){ .... } } }
IOC之后
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; /** * IOC之后 * * @author mdl * @date 2020/3/13 15:54 */ public class Client { @Autowired UserService userService; @Autowired ChaiQianBanService chaiQianBanService; /** * 拆迁分房 * * @param args */ public static void main(String[] args) { // 1. 查询小张 User xiaoZhang = userService.queryBy("小张"); // 2.拆迁办分房 chaiQianBanService.allocateHouse(xiaoZhang); } class ChaiQianBanService { @Autowired private UserService userService; @Autowired private ChaiQianBanDao chaiQianBanDao; public ChaiQianBanService() { } public void allocateHouse(User user) { // 3. 校验 boolean isSuccess =checkUser(user); if(isSuccess){ // 分配 chaiQianBanDao.allocateHouseToUser(user); } } public boolean checkUser(User user){ .... } } }
可以看出,客户端需要的只是对象的服务,而不关心对象是怎么实例化的。并且,对象之前的关系,也解耦了!