所谓依赖注入,和控制反转是一个概念。是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。依赖注入通常有两种:
设值注入 构造注入(暂不做介绍)
看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。
设值注入是指通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。看下面代码,是Person的接口
//定义Person接口 public interface Person { public void useAxe(); //Person接口里定义一个使用斧子的方法 }
然后是Axe的接口
//定义Axe接口 public interface Axe { public void chop(); //Axe接口里有个砍的方法 }
Person的实现类
//Chinese实现Person接口 public class Chinese implements Person { //面向Axe接口编程,而不是具体的实现类 private Axe axe; //默认的构造器 public Chinese() {} //设值注入所需的setter方法 public void setAxe(Axe axe) { this.axe = axe; } //实现Person接口的useAxe方法 public void useAxe() { System.out.println(axe.chop()); } }
Axe的第一个实现类
//Axe的第一个实现类 StoneAxe public class StoneAxe implements Axe { //默认构造器 public StoneAxe() {} //实现Axe接口的chop方法 public String chop() { return "石斧砍柴好慢"; } }
下面采用Spring的配置文件将Person实例和Axe实例组织在一起。配置文件如下所示:
<!-- 下面是标准的XML文件头 --> <?xml version="1.0" encoding="gb2312"?> <!-- 下面一行定义Spring的XML配置文件的dtd --> "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- 以上三行对所有的Spring配置文件都是相同的 --> <!-- Spring配置文件的根元素 --> <BEANS> <!—定义第一bean,该bean的id是chinese, class指定该bean实例的实现类 --> <BEAN class=lee.Chinese id=chinese> <!-- property元素用来指定需要容器注入的属性,axe属性需要容器注入此处是设值注入,因此Chinese类必须拥有setAxe方法 --> <property name="axe"> <!-- 此处将另一个bean的引用注入给chinese bean --> <REF local="”stoneAxe”/"> </property> </BEAN> <!-- 定义stoneAxe bean --> <BEAN class=lee.StoneAxe id=stoneAxe /> </BEANS>
从配置文件中,可以看到Spring管理bean的灵巧性。bean与bean之间的依赖关系放在配置文件里组织,而不是写在代码里。通过配置文件的 指定,Spring能精确地为每个bean注入属性。因此,配置文件里的bean的class元素,不能仅仅是接口,而必须是真正的实现类。
如果需要改写Axe的实现类。或者说,提供另一个实现类给Person实例使用。Person接口、Chinese类都无须改变。只需提供另一个Axe的实现,然后对配置文件进行简单的修改即可。
Axe的另一个实现如下:
//Axe的另一个实现类 SteelAxe public class SteelAxe implements Axe { //默认构造器 public SteelAxe() {} //实现Axe接口的chop方法 public String chop() { return "钢斧砍柴真快"; } }
然后,修改原来的Spring配置文件,在其中增加如下一行:
<!-- 定义一个steelAxe bean--> <BEAN class=lee.SteelAxe id=steelAxe />
该行重新定义了一个Axe的实现:SteelAxe。然后修改chinese bean的配置,将原来传入stoneAxe的地方改为传入steelAxe。也就是将
<REF local="”stoneAxe”/">
改成
<REF local="”steelAxe”/">
此时再次执行程序,将得到如下结果:
钢斧砍柴真快
Person与Axe之间没有任何代码耦合关系,bean与bean之间的依赖关系由Spring管理。采用setter方法为目标bean注入属性的方式,称为设值注入。
相关推荐
### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...
### 依赖注入那些事儿 #### 1. IGame游戏公司的故事 ##### 1.1 讨论会 IGame是一家专注于开发动作角色扮演游戏的游戏公司。这类游戏通常包含一个基础功能——打怪,即玩家通过攻击怪物来获得经验值、虚拟货币和...
依赖注入(Dependency Injection,简称DI)是一种设计模式,它在软件工程中被广泛应用于解耦组件,提高代码的可测试性和可维护性。在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬...
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...
依赖注入(Dependency Injection, DI)是一种设计模式,它有助于降低代码耦合度,提高可测试性和可维护性。本篇文章将深入探讨如何使用EF Core结合依赖注入来实现数据库的基本操作。 1. **EF Core 简介** EF Core ...
"IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中的一种重要技术,旨在解决软件系统中的耦合问题。该技术的核心思想是将被调用构件实例化,并注入到调用构件之中,以实现软件系统的高内聚、低耦合。IoC 依赖...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...
较为框架式的演示了DI服务依赖注入 适用于熟悉C#中的继承,基本的Core命令使用等. 该示例演示了以服务器集群为背景的各种业务的依赖注入. 示例来自于B站杨中科老师的.NET Core(6.0)教学.
这个“Angular6依赖注入Demo”显然提供了关于如何在Angular6应用中使用依赖注入的实际示例,同时也包含了懒加载(Lazy Loading)的实现,这有助于提高应用程序的性能,因为只有在用户实际需要时才会加载特定模块。...
在IT行业中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它有助于提高代码的可测试性、可维护性和灵活性。PHP作为一个广泛用于Web开发的动态类型语言,也有许多优秀的依赖注入容器库来支持这一模式。...
### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...
【Spring依赖注入详解】 在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇...
在编程领域,反射和依赖注入是两种非常重要的概念,它们都是高级编程技术,可以极大地提升代码的灵活性和可维护性。下面将详细讲解这两个概念及其在实际应用中的DEMO示例。 **反射** 反射是Java(以及其他一些面向...
在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...
依赖注入的核心思想是,一个对象不应该负责创建或查找它所依赖的对象,而是应该由外部源(如容器或框架)来提供这些依赖。这样可以减少类之间的耦合,使得代码更加灵活和易于测试。在PHP中,我们通常通过构造函数、...
### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...
C++依赖注入是一种设计模式,它对于简化软件设计、控制依赖关系、降低耦合度、提高代码的内聚度以及方便进行单元测试具有重要作用。依赖注入的核心思想是将依赖对象的创建和使用分离,通过第三方(例如容器)在对象...
【标题】"第三章 Spring4 依赖注入"深入解析 在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化...