`

深入理解Spring框架中的"依赖注入"

阅读更多
Spring-FrameWork
Spring框架的核心概念就是“依赖注入”,什么是依赖注入?其实理解起来很简单,依赖注入其实就是框架用于连接各个应用程序的一项技术。
框架负责将你的应用程序中的各种相互依赖进行连接起来,并从应用程序代码中完全解决掉连接逻辑和对象创建。
举一个描述收银机的例子:
1.创建一个接口用来描述收银机
public interface CashRegister 
{
    public BigDecimal callculateTotalprice(ShoppingCart cart);//参数是一个购物车,方法返回是购物车中所有商品的价格.
}
2.创建一个接口用来实现某商品价格查询
public interface PriceMatrix
{
    public BigDecimal lookupPrice(Item item);//参数是某一个商品
}
3.创建CashRegister它的实现类.
public class CashRegisterImpl implements CashRegister
{
   private PriceMatrix  priceMatrix = new PriceMatrixImpl();

   public BigDecimal calculateTotaPrice(ShoppingCart cart)
   {
      BigDecimal total = new BigDecimal("0.0");
      for(Item item:cart.getItems())
      {
        total.add(priceMatrix.lookupPrice(item));
      }
      return total;
   }
}
以上实例存在三个问题:
第一个,每一个“CashRegisterImpl”的实例都会存在PriceMatrixImpl实例,也就是说创建或维护PriceMatrixImpl这个对象成本会很高。
其实就是在浪费系统的资源,最好能多个客户端共享一个实例.
第二个,同时是最为重要的问题,"CashRegisterImpl"实例很想具体的知道关于PriceMatrix实现细节.而现在它不知道自己所依赖接口的细节。
但是现在CashRegisterImpl通过自己创建了PriceMatrix对象,CashRegisterImpl已经完全的和PriceMatrixImpl对象耦合的关联在一起了。
第三个,实现类已经和CashRegisterImpl紧密的结合在一起了,很难进行单元测试。单元测试本身就是应该脱离外部资源的情况下运行.
如果要测试唯一的选择就是需要完全的运行PriceMatrixImpl.这样一来不仅会减慢单元测试而且还让我们无法控制的资源耦合在一起。
可见以上程序实现的三大不足.
要解决第一个问题,移除PriceMatrix实现类的实例,这样就可以让CashRegisterImpl对象从物理实现细节中解放出来了。更重要的是
PriceMatrixImpl对象不再CashRegisterImpl实例中,不在属于CashRegisterImpl独有,而是很容易地被所有类共享。
听说Service Locator模式不错,这个模式的优势就是:封装了获取所需要的对象的引用动作,说白点就是不用你用new关键字去创建一个对象。
这个模式会调用所对象的GETTER方法.具体方法如下。
public class CashRegisterImpl implements CashRegister
{
       private PriceMatrix priceMatrix;
       
       public CashRegisterImpl()
       {
                priceMatrix = ServiceLocator.getPriceMatrix();
       }
       public BigDecimal calculateTotaPrice(ShoppingCart cart)
       {
                BigDecimal total = new BigDecimal("0.0");
                
		for(Item item:cart.getItems())
                {
                  total.add(priceMatrix.lookupPrice(item));
                }
                    return total;
         }
}
虽然从表面上来看使用ServiceLocator,该类不用关心创建PriceMatrix实例了.但是第三个存在的问题还是解决不了。
locator方法要求不允许在测试的情况下返回一个模拟的PriceMatrix对象,允许你在实际部署中返回一个真的PriceMatrix对象,
就是说你可以创建PriceMatrix实例,但是必须要在外界的资源同步下才能测试。
这时候神秘的人物来了,就是spring框架中的"依赖注入"了,它很灵活,让你用起来得心应手。它可以有很多中注入方式。
首先说第一种注入:基于构造器注入
public class CashRegisterImpl implements CashRegister
{
      private  PriceMatrix priceMatrix;

      public CashRegisterImpl(PriceMatrix priceMatrix);
      {
         this.priceMatrix = priceMatrix ;
      }
      public BigDecimal calculateTotaPrice(ShoppingCart cart)
      {
                BigDecimal total = new BigDecimal("0.0");
                
		for(Item item:cart.getItems())
                {
                  total.add(priceMatrix.lookupPrice(item));
                }
                    return total;
       }

}
就这样,简单的获取PriceMatrix对象,看到本书上说的很恰当"你不用来管我要对象,我会主动给你创建好"
另一种注入方式:基于设置方法注入
public class CashRegisterImpl implements CashRegister
{
      private  PriceMatrix priceMatrix;

      public setPriceMatrix(PriceMatrix priceMatrix);
      {
         this.priceMatrix = priceMatrix ;
      }
      public BigDecimal calculateTotaPrice(ShoppingCart cart)
      {
                BigDecimal total = new BigDecimal("0.0");
                
		for(Item item:cart.getItems())
                {
                  total.add(priceMatrix.lookupPrice(item));
                }
                    return total;
       }

}
选择那种注入?这个其实不重要,Spring框架没有具体的要求强制用那个方法注入,
基于构造方法注入危险是:在提供不同的实例时候有可能造成构造器泛滥,随你实例增加,
各个应用程序需要不同的依赖,所以构造器的数目也在不断的增加。建议还是用设置方法注入。
这样,就解决了以上事例中的三个问题,解决了互相的依赖关系,还可以轻松的模拟出PriceMatrix
对象,做好测试。从Dependency Injection 充分的体现出了Spring框架的轻量级。

 

分享到:
评论

相关推荐

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    Spring Ioc 注解 依赖注入

    其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...

    spring依赖注入底层详解

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的...通过深入理解这一机制,开发者可以更好地利用Spring框架,构建出更高质量的Java应用。

    java中spring依赖注入的简单例子

    javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...

    Spring 核心机制(依赖注入)

    在Spring框架中,依赖注入和控制反转实际上是同一概念的不同表达形式。当程序中的组件需要另一个组件的帮助时,通常是由调用者(即需要帮助的角色)来创建被调用者(即提供帮助的角色)的实例。但在Spring中,这个...

    Spring 三种依赖注入方式.doc

    Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口注入 接口注入是指通过接口...

    Spring的依赖注入,与前置通知的实例

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许对象之间的耦合性降低,使得代码更易于测试和维护。依赖注入的核心思想是将一个对象依赖的其他对象通过构造函数、setter方法...

    spring依赖注入的实现原理

    Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中的一个重要概念,它是Spring框架的核心特性之一,用于降低组件之间的耦合度,提高代码的可测试性和可维护性。本篇文章将深入探讨Spring依赖注入的...

    第三章 Spring4 依赖注入

    【标题】"第三章 Spring4 依赖注入"深入解析 在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们...理解并熟练运用依赖注入,能更好地发挥Spring框架的优势,提升软件质量。

    模仿Spring依赖注入

    本篇文章将深入探讨Spring框架中的依赖注入机制。 一、依赖注入的概念 依赖注入的核心思想是,一个对象不应该自行创建或查找它所依赖的对象,而是由外部容器(如Spring IoC容器)负责管理和提供这些依赖。通过这种...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    使用反射和注解模拟Spring的依赖注入

    我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的概念。反射是Java提供的一种能力,允许程序在运行时检查和操作类、接口、方法和字段。在Java中,`java....

    Spring中的依赖注入.rar

    Spring框架是Java应用程序开发中的一个核心框架,尤其以其强大的依赖注入(Dependency Injection,简称DI)功能闻名。依赖注入是面向切面编程(AOP)的一个关键原则,它允许开发者将对象之间的依赖关系解耦,使得...

    一步步深入理解Spring内部原理-带源码

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(IOC)和面向切面编程(AOP)功能闻名。为了深入理解Spring的内部原理,我们可以从以下几个关键知识点入手。 1. **依赖注入(Dependency Injection,...

    Spring_依赖注入_面向接口编程

    Spring框架是Java开发中不可或缺的一部分,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心理念,极大地简化了组件之间的耦合,提高了代码的可测试性和可维护性。...

    spring依赖注入三种方式 测试源码

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的三种依赖注入方式,并结合源码分析其工作...

    spring依赖注入例子

    Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得对象之间的关系在运行时由Spring容器管理,而不是硬编码在类内部。这样可以提高代码的可测试性和可维护性,因为对象的依赖关系变得松...

    Java Spring框架依赖包

    总的来说,Java Spring框架依赖包是构建复杂Java应用的基础,它提供了全面的工具和功能,帮助开发者高效地完成任务,同时保持代码的整洁和可维护性。正确管理和理解这些依赖对于开发高质量的Java应用程序至关重要。

Global site tag (gtag.js) - Google Analytics