zoukankan      html  css  js  c++  java
  • 理解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){
                ....
            }
        }
    
    
    }

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

    每一步脚印都要扎得深一点!
  • 相关阅读:
    严格模式
    es6模块与 commonJS规范的区别
    Javascript内置对象、原生对象、宿主对象关系
    实现继承的几种方式
    创建对象的一些方式
    null的小扩展
    getElementById的缩略
    你真的知道为什么不推荐使用@import?
    换行与不换行
    transition与animation
  • 原文地址:https://www.cnblogs.com/bloodthirsty/p/12487661.html
Copyright © 2011-2022 走看看