Java后台-Spring 依赖注入-2020-12-10

简介

Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。

当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立。

假设有一个包含文本编辑器组件的应用程序,并且想要提供拼写检查,在控制反转IoC的场景中,会这样做:

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

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

基于构造函数的依赖注入

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

一个例子:

  • 文本编辑框 TextEditor.java 文件的内容:
package com.tutorialspoint;
public class TextEditor {
   private SpellChecker spellChecker;
   public TextEditor(SpellChecker spellChecker) {
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}
  • 依赖类文件 SpellChecker.java 的内容:
package com.tutorialspoint;
public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}
  • 配置文件 Beans.xml 的内容:




   
   
      
   

   
   
   


  • MainApp.java 文件的内容:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
      te.spellCheck();
   }
}
  • 运行后输出的消息:
Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

在这个例子里,将依赖类 SpellChecker.java注入到TextEditor.java 文件。
如此,便称为依赖注入。

基于设值函数的依赖注入

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

一个例子:

  • TextEditor.java 文件的内容:
package com.tutorialspoint;
public class TextEditor {
   private SpellChecker spellChecker;
   // a setter method to inject the dependency.
   public void setSpellChecker(SpellChecker spellChecker) {
      System.out.println("Inside setSpellChecker." );
      this.spellChecker = spellChecker;
   }
   // a getter method to return spellChecker
   public SpellChecker getSpellChecker() {
      return spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}
  • 依赖类文件 SpellChecker.java 的内容:
package com.tutorialspoint;
public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   }  
}
  • 配置文件 Beans.xml 的内容:




   
   
      
   

   
   
   


  • MainApp.java 文件的内容:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
      te.spellCheck();
   }
}
  • 运行应用程序,输出消息:
Inside SpellChecker constructor.
Inside setSpellChecker.
Inside checkSpelling.

在基于构造函数注入中,使用的是〈bean〉标签中的〈constructor-arg〉元素;而在基于设值函数的注入中,使用的是〈bean〉标签中的〈property〉元素。

注入内部 Beans

inner beans 是在其他 bean 的范围内定义的 bean。因此元素中的元素称为内部bean。

只需要修改配置文件 Beans.xml的内容,就是注意内部Bean的例子:





   
   
      
         
       
   


注入集合

如果想传递多个值,如 Java Collection 类型 List、Set、Map 和 Properties,那么可以使用等标签;

例子:

  • JavaCollection.java 文件的内容:
package com.tutorialspoint;
import java.util.*;
public class JavaCollection {
   List addressList;
   Set  addressSet;
   Map  addressMap;
   Properties addressProp;
   // a setter method to set List
   public void setAddressList(List addressList) {
      this.addressList = addressList;
   }
   // prints and returns all the elements of the list.
   public List getAddressList() {
      System.out.println("List Elements :"  + addressList);
      return addressList;
   }
   // a setter method to set Set
   public void setAddressSet(Set addressSet) {
      this.addressSet = addressSet;
   }
   // prints and returns all the elements of the Set.
   public Set getAddressSet() {
      System.out.println("Set Elements :"  + addressSet);
      return addressSet;
   }
   // a setter method to set Map
   public void setAddressMap(Map addressMap) {
      this.addressMap = addressMap;
   }  
   // prints and returns all the elements of the Map.
   public Map getAddressMap() {
      System.out.println("Map Elements :"  + addressMap);
      return addressMap;
   }
   // a setter method to set Property
   public void setAddressProp(Properties addressProp) {
      this.addressProp = addressProp;
   } 
   // prints and returns all the elements of the Property.
   public Properties getAddressProp() {
      System.out.println("Property Elements :"  + addressProp);
      return addressProp;
   }
}
  • 配置文件 Beans.xml 文件:




   
   

      
      
         
            INDIA
            Pakistan
            USA
            USA
         
      

      
      
         
            INDIA
            Pakistan
            USA
            USA
        
      

      
      
         
            
            
            
            
         
      

      
      
         
            INDIA
            Pakistan
            USA
            USA
         
      

   


  • MainApp.java 文件的内容:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
      JavaCollection jc=(JavaCollection)context.getBean("javaCollection");
      jc.getAddressList();
      jc.getAddressSet();
      jc.getAddressMap();
      jc.getAddressProp();
   }
}
  • 运行该应用程序,输出以下信息:
List Elements :[INDIA, Pakistan, USA, USA]
Set Elements :[INDIA, Pakistan, USA]
Map Elements :{1=INDIA, 2=Pakistan, 3=USA, 4=USA}
Property Elements :{two=Pakistan, one=INDIA, three=USA, four=USA}

注入空字符串


   

相当于 Java 代码:exampleBean.setEmail("");

注入 null


   

相当于 Java 代码:exampleBean.setEmail(null);

参考文章

Spring 依赖注入

你可能感兴趣的:(Java后台-Spring 依赖注入-2020-12-10)