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实战》 第二章

原文地址:https://www.cnblogs.com/YaoFrankie/p/11432938.html

时间: 2024-11-09 01:44:26

Spring依赖注入浅析的相关文章

Spring依赖注入

Spring依赖注入基础 一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是可以专注业务逻辑.因此学习Spring Framework在架构和模式方面的结构和原理,对我们在架构和模块级别的理解帮助极大.Spring Framework(参考1)的宗旨是简化Java开发,主要的手段如下: (1)在架构上解耦:通过DI(依赖注入)管理类型依赖,通过AO

SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. Spring依赖注入(

(转)Java Web系列:Spring依赖注入基础

一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是可以专注业务逻辑.因此学习Spring Framework在架构和模式方面的结构和原理,对我们在架构和模块级别的理解帮助极大.Spring Framework(参考1)的宗旨是简化Java开发,主要的手段如下: (1)在架构上解耦:通过DI(依赖注入)管理类型依赖,通过AOP分离关注点,减少重复代码

java框架篇---spring 依赖注入

spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model; public class User { private String username; private String password; public User(){} public User(String username, String password) { super(); this.username = use

Java Web系列:Spring依赖注入基础

一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是可以专注业务逻辑.因此学习Spring Framework在架构和模式方面的结构和原理,对我们在架构和模块级别的理解帮助极大.Spring Framework(参考1)的宗旨是简化Java开发,主要的手段如下: (1)在架构上解耦:通过DI(依赖注入)管理类型依赖,通过AOP分离关注点,减少重复代码

Spring学习笔记——Spring依赖注入原理分析

我们知道Spring的依赖注入有四种方式,分别是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 下面我们先分析下这几种注入方式 1.get/set方法注入 public class SpringAction { //注入对象springDao private SpringDao springDao; //一定要写被注入对象的set方法 public void setSpringDao(SpringDao springDao) { this.springDao = spri

项目构建之maven篇:4.坐标与依赖及spring依赖注入demo

源代码下载 坐标 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> groupId:定义当前maven项目隶属的实际项目 artifactId:定义实际项目中的一个maven项目(模块),推荐实际项

Spring依赖注入 --- 简单使用说明

Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣的同学可以参考我的日志:http://www.cnblogs.com/kodoyang/p/Frame_Imitate_Spring.html 我们会用spring提供的ClassPathXmlApplicationContext实现来代替这篇日志中相应的实现 为导入的jar文件配置api 对应的L

研究 Spring MVC 将请求分发到 Spring 依赖注入的类实例

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 一上午时间,碰了 N 个钉子,不断地把钉子拨掉,记录一下选择的工具和方法: 1.首先 Spring Mvc 框架的下载,那么有三个包是必不可少的: