Spring – 工厂方法的依赖注入
Spring框架提供了依赖注入来去除对象之间的常规依赖关系。为了使用工厂方法注入依赖,我们将使用 bean 元素的factory-method和factory-bean属性中的两个。
Note: Factory methods are those methods that return the instance of the class.
- 工厂方法:这些是为了注入 bean 而调用的方法类型。
- 工厂 Bean:这些是调用工厂方法的 bean 的引用。
工厂方法的类型
工厂方法分为三种:
- 静态工厂方法- 它用于返回其自己的类的实例。静态工厂方法用于单例设计模式。
- 静态工厂方法——用于返回另一个类的运行时实例。
- 非静态工厂方法——用于返回另一个类的运行时实例。
实现:这里我们将使用工厂模式注入依赖项。为此,我们将创建一个类并将其命名为 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 步:运行应用程序
输出:
B. 静态工厂方法——返回另一个类的实例
在本例中,我们将使用静态工厂方法注入其他类的依赖项。
第 1 步:创建接口
我们将创建一个界面并将其命名为GeeksCourses。 Java并在其中定义一个getCourseDetail()方法。
文件:极客课程。Java
Java
// Java Program to Illustrate GeeksCourses interface
// Interface
public interface GeeksCourses {
// Print statement
public void getCourseDetail();
}
第 2 步:创建依赖类
在这一步中,我们将创建两个不同的类DSACourses和JavaCourses 。我们将从这些类实现 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 步:运行应用程序。
输出:
C. 非静态工厂方法——返回另一个类的实例
在本例中,我们将使用非静态工厂方法注入其他类的依赖项。
第 1 步:创建接口
我们将创建一个界面并将其命名为GeeksCourses。 Java并在其中定义一个getCourseDetail()方法。
文件:极客课程。Java
Java
// Java Program to Illustrate GeeksCourses Interface
// Interface
public interface GeeksCourses
{
// Print statement
public void getCourseDetail();
}
第 2 步:创建依赖类
在这一步中,我们将创建两个不同的类DSACourses和JavaCourses 。我们将从这些类中实现 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 步:运行应用程序
输出: