📜  春天——FactoryBean

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

春天——FactoryBean

Spring 是最流行的Java EE 框架之一。它是一个开源轻量级框架,允许Java EE 7 开发人员构建简单、可靠且可扩展的企业应用程序。该框架主要侧重于提供各种方法来帮助您管理业务对象。与Java数据库连接 (JDBC)、JavaServer Pages (JSP) 和Java Servlet 等经典Java框架和应用程序编程接口 (API) 相比,它使 Web 应用程序的开发更加容易。该框架使用各种新技术,如面向方面编程 (AOP)、普通Java对象 (POJO) 和依赖注入 (DI) 来开发企业应用程序。

Spring 容器有两种类型的 bean:

  • 普通 bean - 默认情况下由 Spring 使用。
  • 工厂 bean——用于生成由 Spring 框架管理的 bean(对象)。

Factory Bean是一个 bean,它充当创建其他 bean 并使用 Spring IOC 容器实例化它们的工厂。工厂 bean 主要用于实现框架设施,因此它们是特定于框架的,不能在 Spring IOC 容器的范围之外使用。例如:

  • JndiObjectFactoryBean – 用于从 JNDI 中查找数据源
  • ProxyFactoryBean - 用于使用 AOP 为 bean 创建代理

如何创建工厂bean?

  1. 我们可以创建一个工厂 bean,我们需要通过我们的(用户定义的)bean 实现 FactoryBean 接口,这将创建其他要由工厂 bean 返回的 bean。
  2. 一个简单的方法是扩展 AbstractFactoryBean 类。我们需要使用工厂 bean 覆盖 createInstance() 方法来创建目标 bean 的实例。之后,我们需要使用 getObjectType() 方法返回目标 bean 的类型。
    • getObjectType() - 此方法将返回工厂 bean 生成的对象类型。

例子

在此示例中,我们将创建一个工厂 bean,该 bean 将根据其部门生成不同类型的学生 bean,并将其 id、first_name 和 last_name 作为每个填充的数据。

第 1 步:创建一个 Maven 项目

在这一步中,我们将创建一个新的 maven 项目,并确保您将创建一个简单的项目(跳过原型选择)。

图 1 – Maven 项目详细信息

第 2 步:添加依赖项

现在我们将 Maven 依赖项添加到我们的应用程序中。将以下依赖项添加到您的 pom.xml

XML

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


Java
public class Student {
  
    // member variable
    private int id;
    private String first_name;
    private String last_name;
    private String department;
  
    // getters and setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getFirst_name() { return first_name; }
    public void setFirst_name(String first_name)
    {
        this.first_name = first_name;
    }
    public String getLast_name() { return last_name; }
    public void setLast_name(String last_name)
    {
        this.last_name = last_name;
    }
    public String getDepartment() { return department; }
    public void setDepartment(String department)
    {
        this.department = department;
    }
  
    // toStirng() method
    @Override public String toString()
    {
        return "Student [id=" + id + ", first_name="
            + first_name + ", last_name=" + last_name
            + ", department=" + department + "]";
    }
}


Java
import org.springframework.beans.factory.config.AbstractFactoryBean;
import com.gfg.model.Student;
  
public class StudentFactoryBean extends AbstractFactoryBean{
  
    // Member variables
    private String department;
  
    public String getDepartment() {
        return department;
    }
  
    public void setDepartment(String department) {
        this.department = department;
    }
  
    // This will return the bean type 
    // that factory bean will create
    @Override
    public Class getObjectType() {
        // TODO Auto-generated method stub
        return Student.class;
    }
  
    // This method will create the 
    // beans using factory bean
    @Override
    protected Object createInstance() throws Exception {
        // TODO Auto-generated method stub
        Student student = new Student();
        student.setId(1);
        student.setFirst_name("geeks");
        student.setLast_name("geeks");
        student.setDepartment(department);
        return student;
    }
  
    @Override
    public String toString() {
        return "StudentFactoryBean [department=" + department + "]";
    }
}

XML


      
    
    
        
    
      


Java
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.gfg.model.Student;
public class TestSpringFactoryBean {
  
    @SuppressWarnings("resource")
    public static void main(String []args) throws Exception {
        // Reading the application-context file using
        // class path of spring context xml file
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
          
        // Spring check the blueprint for Student bean 
        // from application-context.xml file and return it
        Student computer_student = (Student)context.getBean("CSE");
        System.out.println(computer_student.toString());
      
    }
}


第 3 步:创建模型(Bean)类

在这一步中,我们将创建一个模型类 Student。我们的应用程序的Java 。此类将具有 id、first_name、last_name 和部门作为成员变量。我们将创建它的 getter 和 setters 方法,并提供一个 toString() 方法定义。

Java

public class Student {
  
    // member variable
    private int id;
    private String first_name;
    private String last_name;
    private String department;
  
    // getters and setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getFirst_name() { return first_name; }
    public void setFirst_name(String first_name)
    {
        this.first_name = first_name;
    }
    public String getLast_name() { return last_name; }
    public void setLast_name(String last_name)
    {
        this.last_name = last_name;
    }
    public String getDepartment() { return department; }
    public void setDepartment(String department)
    {
        this.department = department;
    }
  
    // toStirng() method
    @Override public String toString()
    {
        return "Student [id=" + id + ", first_name="
            + first_name + ", last_name=" + last_name
            + ", department=" + department + "]";
    }
}

第 4 步:创建 StudentFactoryBean 类

在这一步中,我们将创建一个扩展 AbstractFactoryBean 类的 FactoryBean 类,我们还需要实现它的方法 createInstance() 和 getObjectType()。

Java

import org.springframework.beans.factory.config.AbstractFactoryBean;
import com.gfg.model.Student;
  
public class StudentFactoryBean extends AbstractFactoryBean{
  
    // Member variables
    private String department;
  
    public String getDepartment() {
        return department;
    }
  
    public void setDepartment(String department) {
        this.department = department;
    }
  
    // This will return the bean type 
    // that factory bean will create
    @Override
    public Class getObjectType() {
        // TODO Auto-generated method stub
        return Student.class;
    }
  
    // This method will create the 
    // beans using factory bean
    @Override
    protected Object createInstance() throws Exception {
        // TODO Auto-generated method stub
        Student student = new Student();
        student.setId(1);
        student.setFirst_name("geeks");
        student.setLast_name("geeks");
        student.setDepartment(department);
        return student;
    }
  
    @Override
    public String toString() {
        return "StudentFactoryBean [department=" + department + "]";
    }
}

第 5 步:Bean 配置

在这一步中,我们将创建一个 spring 配置文件并将其命名为 application-contex.xml。我们将配置我们的 bean 并使用 bean 元素的属性标签来设置学生部门的值。 (注意:在 application-context 中,你需要定义你的工厂 bean 类的整个路径)

XML



      
    
    
        
    
      

第 6 步:创建实用程序类

现在,我们将创建一个 Utility 类来测试我们的工厂 bean 方法。为此创建一个新类并将其命名为 TestSpringFactoryBean。 Java并将以下代码添加到其中。

Java

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.gfg.model.Student;
public class TestSpringFactoryBean {
  
    @SuppressWarnings("resource")
    public static void main(String []args) throws Exception {
        // Reading the application-context file using
        // class path of spring context xml file
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
          
        // Spring check the blueprint for Student bean 
        // from application-context.xml file and return it
        Student computer_student = (Student)context.getBean("CSE");
        System.out.println(computer_student.toString());
      
    }
}

输出:

现在,我们将运行我们的应用程序。

输出