7.Spring——依赖注入

2021-07-04 11:06

阅读:637

标签:html   name   部分   地方   string   检查   传递值   有助于   dep   

1.简介

2.Spring 基于构造函数的依赖注入

3.Spring 基于设值函数的依赖注入

4.注入内部beans

5.Spring 注入集合

1.简介

依赖注入

每个基于应用程序的 java 都有几个对象,这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立。

假设你有一个包含文本编辑器组件的应用程序,并且你想要提供拼写检查。标准代码看起来是这样的:

public class TextEditor {
   private SpellChecker spellChecker;  
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

在这里我们所做的就是创建一个 TextEditor 和 SpellChecker 之间的依赖关系。在控制反转的场景中,我们反而会做这样的事情:

public class TextEditor {
   private SpellChecker spellChecker;
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

在这里,TextEditor 不应该担心 SpellChecker 的实现。SpellChecker 将会独立实现,并且在 TextEditor 实例化的时候将提供给 TextEditor,整个过程是由 Spring 框架的控制。

在这里,我们已经从 TextEditor 中删除了全面控制,并且把它保存到其他地方(即 XML 配置文件),且依赖关系(即 SpellChecker 类)通过类构造函数被注入到 TextEditor 类中。因此,控制流通过依赖注入(DI)已经“反转”,因为你已经有效地委托依赖关系到一些外部系统。

依赖注入的第二种方法是通过 TextEditor 类的 Setter 方法,我们将创建 SpellChecker 实例,该实例将被用于调用 setter 方法来初始化 TextEditor 的属性。

因此,DI 主要有两种变体和下面的两个子章将结合实例涵盖它们:

序号 依赖注入类型 & 描述
1 Constructor-based dependency injection

当容器调用带有多个参数的构造函数类时,实现基于构造函数的 DI,每个代表在其他类中的一个依赖关系。

2 Setter-based dependency injection

基于 setter 方法的 DI 是通过在调用无参数的构造函数或无参数的静态工厂方法实例化 bean 之后容器调用 beans 的 setter 方法来实现的。

你可以混合这两种方法,基于构造函数和基于 setter 方法的 DI,然而使用有强制性依存关系的构造函数和有可选依赖关系的 sette r是一个好的做法。

代码是 DI 原理的清洗机,当对象与它们的依赖关系被提供时,解耦效果更明显。对象不查找它的依赖关系,也不知道依赖关系的位置或类,而这一切都由 Spring 框架控制的。

2.Spring 基于构造函数的依赖注入(不需要有get 和set方法)

当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖


bean id="exampleBean" class="examples.ExampleBean">
  constructor-arg type="int" value="2001"/>
  constructor-arg type="java.lang.String" value="Zara"/>
bean>


bean id="exampleBean" class="examples.ExampleBean">
      constructor-arg index="0" value="2001"/>
      constructor-arg index="1" value="Zara"/>
   bean>

beans>
   bean id="foo" class="x.y.Foo">
      constructor-arg ref="bar"/>
      constructor-arg ref="baz"/>
   bean>

   bean id="bar" class="x.y.Bar"/>
   bean id="baz" class="x.y.Baz"/>
beans> 

3.Spring 基于设值函数的依赖注入

当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了。 


bean id="john-classic" class="com.example.Person">
      property name="name" value="John Doe"/>
      property name="spouse" ref="jane"/>
   bean>

   bean name="jane" class="com.example.Person">
      property name="name" value="John Doe"/>
   bean>


bean id="bird" class="com.my.entity.Bird" scope="singleton" init-method="initBean" destroy-method="destroy">
property name="bridName">
value>Joevalue>
property>
property name="color" value="yellow"/>
bean>


xml version="1.0" encoding="UTF-8"?>
beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   bean id="john-classic" class="com.example.Person"
      p:name="John Doe"
      p:spouse-ref="jane"/>
   bean>
   bean name="jane" class="com.example.Person"
      p:name="John Doe"/>
   bean>
beans>

在这里,你不应该区别指定原始值和带有 p-namespace 的对象引用。-ref 部分表明这不是一个直接的值,而是对另一个 bean 的引用。 

4.注入内部beans

注入内部 Beans

正如你所知道的 Java 内部类是在其他类的范围内被定义的,同理,inner beans 是在其他 bean 的范围内定义的 bean。因此在 或 元素内 元素被称为内部bean,如下所示。

xml version="1.0" encoding="UTF-8"?>

beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   bean id="outerBean" class="...">
      property name="target">
         bean id="innerBean" class="..."/>
      property>
   bean>

beans>

   bean id="textEditor" class="com.tutorialspoint.TextEditor">
      property name="spellChecker">
         bean id="spellChecker" class="com.tutorialspoint.SpellChecker"/>
       property>
   bean>

5.Spring 注入集合

7.Spring——依赖注入

标签:html   name   部分   地方   string   检查   传递值   有助于   dep   

原文地址:https://www.cnblogs.com/lukelook/p/9613041.html


评论


亲,登录后才可以留言!