📜  Spring – 工厂方法的依赖注入

📅  最后修改于: 2022-05-13 01:54:28.067000             🧑  作者: Mango

Spring – 工厂方法的依赖注入

Spring框架提供了依赖注入来去除对象之间的常规依赖关系。为了使用工厂方法注入依赖,我们将使用 bean 元素的factory-methodfactory-bean属性中的两个。

  • 工厂方法:这些是为了注入 bean 而调用的方法类型。
  • 工厂 Bean:这些是调用工厂方法的 bean 的引用。

工厂方法的类型

工厂方法分为三种:

  1. 静态工厂方法- 它用于返回其自己的类的实例。静态工厂方法用于单例设计模式。
  2. 静态工厂方法——用于返回另一个类的运行时实例。
  3. 非静态工厂方法——用于返回另一个类的运行时实例。

实现:这里我们将使用工厂模式注入依赖项。为此,我们将创建一个类并将其命名为 Geeks。 Java并将这个类作为依赖注入。

A. 静态工厂方法 - 自己类的返回实例

在这个例子中,我们将创建一个单例类 Geeks。 Java并使用工厂方法将其依赖项注入到我们的主类中。

第 1 步:创建 Geeks 类

为此创建一个Geeks。Java我们还将定义一个geeksMessage()方法来使用工厂方法测试依赖注入。下面是极客的代码。 Java类。

档案:极客。Java

Java
// Java Program to Illustrate Geeks Class
 
// Class
public class Geeks {
 
    // define a private static instance
    public static final Geeks geeks = new Geeks();
     
    // private constructor
    private Geeks() {}
     
    // this method will return the above instance
    // which was created when the class loaded in the memory
    public static Geeks getGeeks() {
        return geeks;
    }
     
    // this method is used to check the dependency injection
    public void geeksMessage() {
        System.out.println("Welcome to geeksforgeeks. DI for static factory method working good");
    }
}


XML

  4.0.0
  com.geeksforgeeks
  DIFactoryMethods
  0.0.1-SNAPSHOT
   
  
  
    
            org.springframework
            spring-context
            5.0.8.RELEASE
    
   


XML
 
 
  
 
   
    
    
   


Java
// Java Program to Illustrate TestDIFactoryMethod Class
 
// Importing required classes
import com.geeksforgeeks.model.Geeks;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for Geeks bean
        // from application-context.xml file and return it
        Geeks geeksObj = (Geeks)context.getBean("geeksId");
 
        // geeksObj contain the dependency of Geeks class
        geeksObj.geeksMessage();
    }
}


Java
// Java Program to Illustrate GeeksCourses interface
 
// Interface
public interface GeeksCourses {
 
    // Print statement
    public void getCourseDetail();
}


Java
// Java Program to Illustrate DSACourses Class
 
// Class
// Implemnting GeeksCourses interface
public class DSACourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail()
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Data Structure & Algorithms");
    }


Java
// Java Program to Illustrate JavaCourses Class
 
// Class
// Implementing GeeksCources interface
public class JavaCourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail()
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Core Java Collections");
    }
}


Java
// Java Program to Illustrate CourseFactory Class
 
package com.geeksforgeeks.model;
 
// Importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import com.geeksforgeeks.dao.JavaCourses;
 
// Class
public class CourseFactory {
 
    // Method
    // factory method returning instance to another class
    public static GeeksCourses getCourses()
    {
        // Returning the instance of JavaCourses class
        // One can also return the instance of DSACourses
        return new JavaCourses();
    }
}


XML
 
 
  
 
   
    
    
   


Java
// Java Program to Illustrate TestDIFactoryMethod Class
 
// importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for GeeksCourses bean
        // from application-context.xml file and return it
        GeeksCourses geeksCourses
            = (GeeksCourses)context.getBean("courseId");
 
        // geeksCourses contain the dependency
        // of GeeksCourses class
        geeksCourses.getCourseDetail();
    }
}


Java
// Java Program to Illustrate GeeksCourses Interface
 
// Interface
public interface GeeksCourses
{
    // Print statement
    public void getCourseDetail();
}


Java
// Java Program to illustrate DSACourses Class
 
// Class
// Implementing GeeksCourses interface
public class DSACourses implements GeeksCourses {
 
    // Override the getCourseDeail() method
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Data Structure & Algorithms");
    }
}


Java
// Java Program to Illustrate JavaCourses Class
 
// Class
public class JavaCourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail() method
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Core Java Collections");
    }
}


Java
// Java Program to Illustrate CourseFactory Class 
 
// Importing required classes
import com.geeksforgeeks.dao.DSACourses;
import com.geeksforgeeks.dao.GeeksCourses;
 
// Class
public class CourseFactory {
 
    // Non-static factory method that returns
    // the instance to another class
    public GeeksCourses getCourses()
    {
 
        // Returning the instance of JavaCourses class
        // One can also return the instance of DSACourses
        return new DSACourses();
    }
}


XML
 
 
  
 
   
    
    
    
   


Java
// Java Program to Illustrate TestDIFactoryMethod Class
 
// Importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for GeeksCourses bean
        // from application-context.xml file and return it
        GeeksCourses geeksCourses
            = (GeeksCourses)context.getBean("courseId");
 
        // geeksCourses contain the dependency
        // of GeeksCourses class
        geeksCourses.getCourseDetail();
    }
}


第 2 步:添加依赖项

在这一步中,我们将在 pom.xml 文件中添加以下依赖项。

文件:pom.xml

XML


  4.0.0
  com.geeksforgeeks
  DIFactoryMethods
  0.0.1-SNAPSHOT
   
  
  
    
            org.springframework
            spring-context
            5.0.8.RELEASE
    
   


第 3 步: Bean 配置

现在,我们将在类路径中创建application-context.xml文件。我们将使用 application-context 文件使用工厂方法配置我们的 bean。下面是 application-context.xml 文件的代码。

文件:application-context.xml

XML

 
 
  
 
   
    
    
   


第 4 步:创建实用程序类

现在,我们将创建一个 Utility 类来测试我们的应用程序。为此创建一个新类并将其命名为TestDIFactoryMethod。 Java并将以下代码添加到其中。

文件:TestDIFactoryMethod。Java

Java

// Java Program to Illustrate TestDIFactoryMethod Class
 
// Importing required classes
import com.geeksforgeeks.model.Geeks;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for Geeks bean
        // from application-context.xml file and return it
        Geeks geeksObj = (Geeks)context.getBean("geeksId");
 
        // geeksObj contain the dependency of Geeks class
        geeksObj.geeksMessage();
    }
}


第 5 步:运行应用程序

输出:

图 1 – 自己的类实例的静态工厂方法

B. 静态工厂方法——返回另一个类的实例

在本例中,我们将使用静态工厂方法注入其他类的依赖项。

第 1 步:创建接口

我们将创建一个界面并将其命名为GeeksCourses。 Java并在其中定义一个getCourseDetail()方法。

文件:极客课程。Java

Java

// Java Program to Illustrate GeeksCourses interface
 
// Interface
public interface GeeksCourses {
 
    // Print statement
    public void getCourseDetail();
}


第 2 步:创建依赖类

在这一步中,我们将创建两个不同的类DSACoursesJavaCourses 。我们将从这些类实现 GeeksCourses 接口并覆盖getCourseDetail()方法。下面是这两个类的代码。

文件:DSAC 课程。Java

Java

// Java Program to Illustrate DSACourses Class
 
// Class
// Implemnting GeeksCourses interface
public class DSACourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail()
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Data Structure & Algorithms");
    }

文件:Java 课程。Java

Java

// Java Program to Illustrate JavaCourses Class
 
// Class
// Implementing GeeksCources interface
public class JavaCourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail()
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Core Java Collections");
    }
}


第三步:创建一个工厂类

现在,我们将创建一个CourseFactory类。此类将具有 GeeksCourses 接口的静态工厂方法,该方法将返回另一个类(DSACourses 和 JavaCourses)的实例。下面是 CourseFactory 的代码。 Java类。

文件:课程工厂。Java

Java

// Java Program to Illustrate CourseFactory Class
 
package com.geeksforgeeks.model;
 
// Importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import com.geeksforgeeks.dao.JavaCourses;
 
// Class
public class CourseFactory {
 
    // Method
    // factory method returning instance to another class
    public static GeeksCourses getCourses()
    {
        // Returning the instance of JavaCourses class
        // One can also return the instance of DSACourses
        return new JavaCourses();
    }
}


第 4 步: Bean 配置

现在,我们将在类路径中创建application-context.xml文件。我们将使用 application-context 文件使用工厂方法配置我们的 bean。

文件:application-context.xml

XML

 
 
  
 
   
    
    
   


第 5 步:创建实用程序类

现在,我们将创建一个 Utility 类来测试我们的应用程序。为此创建一个新类并将其命名为TestDIFactoryMethod。 Java并将以下代码添加到其中。

文件:TestDIFactoryMethod。Java

Java

// Java Program to Illustrate TestDIFactoryMethod Class
 
// importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for GeeksCourses bean
        // from application-context.xml file and return it
        GeeksCourses geeksCourses
            = (GeeksCourses)context.getBean("courseId");
 
        // geeksCourses contain the dependency
        // of GeeksCourses class
        geeksCourses.getCourseDetail();
    }
}


第 6 步:运行应用程序。

输出:

图 2 – 另一个类实例的静态工厂方法

C. 非静态工厂方法——返回另一个类的实例

在本例中,我们将使用非静态工厂方法注入其他类的依赖项。

第 1 步:创建接口

我们将创建一个界面并将其命名为GeeksCourses。 Java并在其中定义一个getCourseDetail()方法。

文件:极客课程。Java

Java

// Java Program to Illustrate GeeksCourses Interface
 
// Interface
public interface GeeksCourses
{
    // Print statement
    public void getCourseDetail();
}


第 2 步:创建依赖类

在这一步中,我们将创建两个不同的类DSACoursesJavaCourses 。我们将从这些类中实现 GeeksCourses 接口并覆盖 getCourseDetail() 方法。下面是这两个类的代码。

文件:DSAC 课程。Java

Java

// Java Program to illustrate DSACourses Class
 
// Class
// Implementing GeeksCourses interface
public class DSACourses implements GeeksCourses {
 
    // Override the getCourseDeail() method
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Data Structure & Algorithms");
    }
}


文件:Java 课程。Java

Java

// Java Program to Illustrate JavaCourses Class
 
// Class
public class JavaCourses implements GeeksCourses {
 
    // Method
    // Override the getCourseDeail() method
    public void getCourseDetail()
    {
        // Print statement
        System.out.println("Core Java Collections");
    }
}


第三步:创建一个工厂类

现在,我们将创建一个CourseFactory类。此类将具有 GeeksCourses 接口的非静态工厂方法,该方法将返回另一个类(DSACourses 和 JavaCourses)的实例。

文件:课程工厂。Java

Java

// Java Program to Illustrate CourseFactory Class 
 
// Importing required classes
import com.geeksforgeeks.dao.DSACourses;
import com.geeksforgeeks.dao.GeeksCourses;
 
// Class
public class CourseFactory {
 
    // Non-static factory method that returns
    // the instance to another class
    public GeeksCourses getCourses()
    {
 
        // Returning the instance of JavaCourses class
        // One can also return the instance of DSACourses
        return new DSACourses();
    }
}


第 4 步: Bean 配置

现在,我们将在类路径中创建一个application-context.xml文件。我们将使用 application-context 文件使用工厂方法配置我们的 bean。

文件:application-context.xml

XML

 
 
  
 
   
    
    
    
   


第 5 步:创建实用程序类

现在,我们将创建一个 Utility 类来测试我们的应用程序。为此创建一个新类并将其命名为' TestDIFactoryMethod. Java并将以下代码添加到其中。

文件:TestDIFactoryMethod。Java

Java

// Java Program to Illustrate TestDIFactoryMethod Class
 
// Importing required classes
import com.geeksforgeeks.dao.GeeksCourses;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
// Class
public class TestDIFactoryMethod {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Reading the application-context file
        // from the class-path
        AbstractApplicationContext context
            = new ClassPathXmlApplicationContext(
                "application-context.xml");
 
        // Spring check the blueprint for GeeksCourses bean
        // from application-context.xml file and return it
        GeeksCourses geeksCourses
            = (GeeksCourses)context.getBean("courseId");
 
        // geeksCourses contain the dependency
        // of GeeksCourses class
        geeksCourses.getCourseDetail();
    }
}


第 6 步:运行应用程序

输出:

图 2 – 另一个类实例的非静态工厂方法