• Spring依赖注入浅析


    1. 概念理解

    • 依赖注入
      • 谁注入谁? 依赖对象注入IoC容器
    • 控制反转
      • 谁控制谁?控制什么? IoC容器控制对象,控制依赖对象的创建与注入
      • 为什么称为反转?创建、注入对象的控制权由程序员的主观意愿转为IoC容器统一管理。

    2. 传统方式构建对象间依赖关系

    public class DvdPlayMissionImpossible {
    
        private MissionImpossibleCd missionImpossibleCd;
    
        public DvdPlayMissionImpossible(){
            this.missionImpossibleCd = new MissionImpossibleCd(); // 紧耦合
        }
    
        public void play(){
            System.out.println("一台只能看" + missionImpossibleCd.getCompactDiskName() + "的DVD");
        }
    }
    
    public class DvdPlayFurious {
    
        private FuriousCd furiousCd;
    
        public DvdPlayFurious(){
            this.furiousCd = new FuriousCd(); // 紧耦合
        }
    
        public void play(){
            System.out.println("一台只能看" + furiousCD.getCompactDiskName() + "的DVD");
        }
    }
    
    
    public class MissionImpossibleCd {
    
        public String getCompactDiskName(){
            return "碟中谍";
        }
    }
    
    public class FuriousCd {
    
        public String getCompactDiskName(){
            return "速度与激情";
        }
    }
    
    // Traditional Way.
    @Test
    public void dvdPlayerMissionImpossibleTest(){
        DvdPlayMissionImpossible dvdPlayMissionImpossible = new DvdPlayMissionImpossible();
        DvdPlayFurious           dvdPlayFurious           = new DvdPlayFurious();
        dvdPlayMissionImpossible.play(); // 一台只能看碟中谍的DVD
        dvdPlayFurious.play();           // 一台只能看速度与激情的DVD
    }

    3. DI方式构建对象间依赖关系

    • 所有CD都拥有电影名称,因此抽象成一个CompactDisk接口。
    public interface CompactDisk {
        String getCDName();
    }
    
    @Component
    public class MissionImpossible implements CompactDisk {
    
        @Override
        public String getCDName() {
            return "碟中谍";
        }
    }
    
    @Component
    public class Furious implements CompactDisk{
    
        @Override
        public String getCDName() {
            return "速度与激情";
        }
    }
    • 所有DVD播放器都拥有播放的功能,因此抽象成一个MediaPlayer接口。
    public interface MediaPlayer {
        void play();
    }
    
    @Component
    public class DvdPlayer implements MediaPlayer {
    
        @Autowired
        @Qualifier("missionImpossible")
        private CompactDisk cd;
    
        @Override
        public void play() {
            System.out.println("一台可以看" + cd.getCDName() + "的DVD");
        }
    }
    
    @Component
    public class VCDPlayer implements MediaPlayer {
    
        @Autowired
        @Qualifier("furious")
        private CompactDisk cd;
    
        @Override
        public void play() {
            System.out.println("一台可以看" + cd.getCDName() + "的VCD");
        }
    }
    • 单元测试
    @Autowired
    DvdPlayer dvdPlayer;
    
    @Autowired
    VCDPlayer vcdPlayer;
    
    // DI Way.
    @Test
    public void dvdAndVcdPlayerTest(){
        dvdPlayer.play(); // 一台可以看碟中谍的DVD
        vcdPlayer.play(); // 一台可以看速度与激情的VCD
    }

    4. DI优势

    • 对象之间解耦,毕竟一台只能看一部电影的播放器,我想没人愿意买吧。
    • 同一个对象,IoC容器只需要创建一次。
    • IoC容器会帮你自动匹配对象之间复杂的依赖关系。

    5. 参考资料

    • https://www.iteye.com/blog/jinnianshilongnian-1413846
    • https://www.zhihu.com/question/23277575/answer/169698662
    • 《Spring实战》 第二章
  • 相关阅读:
    为什么今日头条是技术牛人收割机(FW)
    独家|浅谈用户行为数据的价值挖掘(PPT)(FW)
    深度学习笔记
    "堕落"的头条,还是"不堪"的民众?
    理解传统企业的问题与困惑
    人工智能在医疗领域究竟要怎么玩?(FW)
    佟崴嵬
    youtube true view的逻辑
    AI第一性原理
    域对象的属性和请求的转发重定向
  • 原文地址:https://www.cnblogs.com/YaoFrankie/p/11432938.html
Copyright © 2020-2023  润新知