Spring Dependency Injection 简明教程

Spring DI - Static Factory

Spring 提供了一个使用 factory-method 属性注入相关依赖项的选项。

Spring provides an option to inject dependency using factory-method attribute.

Example

以下示例展示了 TextEditor 类,它只能使用纯基于 setter 的注入进行依赖项注入。

The following example shows a class TextEditor that can only be dependency-injected using pure setter-based injection.

让我们更新在 Spring DI - Create Project 章节中创建的项目。我们将添加以下文件 −

Let’s update the project created in Spring DI - Create Project chapter. We’re adding following files −

  1. TextEditor.java − A class containing a SpellChecker as dependency.

  2. SpellChecker.java − A dependency class.

  3. MainApp.java − Main application to run and test.

以下为 TextEditor.java 文件的内容 −

Here is the content of TextEditor.java file −

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;
   private String name;

   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }
   public SpellChecker getSpellChecker() {
      return spellChecker;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      return name;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

以下是另一个依赖类文件 SpellChecker.java 的内容 −

Following is the content of another dependent class file SpellChecker.java

这个类构造函数是私有的。所以无法用 new 运算符直接用其他对象创建其对象。它有一个静态工厂方法来获取一个实例。

This class constructor is private. So its object can not be created directly using new operator by other object. It has a static factory method to get an instance.

package com.tutorialspoint;

public class SpellChecker {
   private SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public static SpellChecker getInstance() {
      System.out.println("Inside SpellChecker getInstance." );
      return new SpellChecker();
   }
   public void checkSpelling(){
      System.out.println("Inside checkSpelling." );
   }
}

以下是 MainApp.java 文件的内容−

Following is the content of the MainApp.java file −

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("applicationcontext.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
      te.spellCheck();
   }
}

下面是配置了自动装配的配置 applicationcontext.xml

Following is the configuration file applicationcontext.xml which has configuration for autowiring byName

<?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">

   <!-- Definition for textEditor bean -->
   <bean id = "textEditor" class = "com.tutorialspoint.TextEditor" autowire = "byName">
      <property name = "name" value = "Generic Text Editor" />
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id = "spellChecker" class = "com.tutorialspoint.SpellChecker" factory-method="getInstance"></bean>
</beans>

完成源文件和 Bean 配置文件创建后,我们运行该应用程序。如果您的应用程序一切正常,它将打印以下消息−

Once you are done creating the source and bean configuration files, let us run the application. If everything is fine with your application, it will print the following message −

Inside SpellChecker getInstance.
Inside SpellChecker constructor.
Inside checkSpelling.