理解Spring IOC

一、理论

所谓 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){
            ....
        }
    }


}

可以看出,客户端需要的只是对象的服务,而不关心对象是怎么实例化的。并且,对象之前的关系,也解耦了!

每一步脚印都要扎得深一点!
原文地址:https://www.cnblogs.com/bloodthirsty/p/12487661.html