28

我是新泉。在 Bean 标签中,我找到了 factory-method 和 factory-bean 属性。factory-method 和 factory-bean 有什么区别?

我正在使用工厂方法来调用我的 getInstance 静态方法来创建单例对象。

factory-bean 是做什么用的?


对于给定的答复,我的理解是

工厂方法用于调用静态方法在同一 bean 类中创建对象。

Factory-bean 用于创建基于工厂设计模式的对象。

例如:-我通过传递我的蔬菜名称(在这种情况下为 EggPlant)从蔬菜工厂询问 EggPlant 对象(这将返回被询问的蔬菜对象)类。

如果我错了,请纠正?

4

6 回答 6

25
factory-method: represents the factory method that will be invoked to inject the bean.
factory-bean: represents the reference of the bean by which factory method will be invoked. It is used if factory method is non-static.

可打印的.java

package com.javatpoint;  
public interface Printable {  
    void print();  
}  

爪哇

package com.javatpoint;  
public class A implements Printable{  
    @Override  
    public void print() {  
        System.out.println("hello a");  
    }      
} 

B.java

package com.javatpoint;  
public class B implements Printable{  
    @Override  
    public void print() {  
        System.out.println("hello b");  
    }  
}  

PrintableFactory.java

package com.javatpoint;  
public class PrintableFactory {  
    //non-static factory method  
    public Printable getPrintable(){  
        return new A();//return any one instance, either A or B  
    }  
}  

应用程序上下文.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<bean id="pfactory" class="com.javatpoint.PrintableFactory"></bean>  
<bean id="p" class="com.javatpoint.Printable" factory-method="getPrintable"   
factory-bean="pfactory"></bean>  

</beans>  

注意public Printable getPrintable()ofPrintableFactory.java是一个非静态方法。通常,如果我们想要访问/调用类的方法或其他资源,我们必须创建它的实例。同样,我们创建了它 bean。使用 bean 的引用变量pfactory,我们调用工厂方法getPrintable

于 2015-11-21T09:21:37.233 回答
16

工厂方法工厂设计模式的区别基本相同,底部有一点注释。一种是用于获取特定类的实例的方法,另一种是负责创建对象的成熟对象,包括执行此操作所需的所有逻辑。

FactoryBean的接口文档指出:

由 BeanFactory 中使用的对象实现的接口,这些对象本身就是工厂。如果一个 bean 实现了这个接口,它被用作一个对象的工厂来暴露,而不是直接作为一个将自己暴露的 bean 实例。

此外,此对象不用作 bean 实例getObject,而是通过其方法用作实例提供者。


更新

搜索factory-methodover a的使用FactoryBean,似乎它经常与遗留单例 bean 一起使用,以获取底层实例,但这种方法不提供对初始化方法的支持,例如,init初始化给定集合的方法的属性。

在这种情况下,您要么必须在使用类之前自己调用它,要么定义一个处理初始化的包装器,要么使用其他机制,例如MethodInvokingFactoryBean.


更新 2

严格来说, aFactoryBean旨在管理特定类型。实际上,您将拥有 an EggPlantFactory,而不是 a ,VegetableFactory因为接口getObject定义的方法FactoryBean不支持参数。

于 2013-09-12T19:18:37.800 回答
10

factory-method:
大家已经解释过了,factory-method是用来告诉spring使用工厂方法来实例化对象的。

注意:静态方法是强制性的,否则会引发异常。

<bean id="serviceFactory" class="com.test.controller.ServiceFactory" factory-method="getServiceFacrotyWithStaticMethod"/>

factory-bean:
当没有静态方法并且仍然想使用非静态方法创建对象时,可以使用factory-bean完成以下技巧:

<bean id="instanceWithOutStaticMethod" factory-bean="serviceFactory" factory-method="getInstanceWithOutStaticMethod" />

注意:上面的 spring 定义中不需要 class 属性。

班级:

public class ServiceFactory {

    public static ServiceFactory getServiceFacrotyWithStaticMethod(){
        return new ServiceFactory();
    }

    public SdCard getInstanceWithOutStaticMethod(){
        return new AdaptorSlot("laptop");
    }
}
于 2015-05-25T12:51:12.597 回答
3

您可以在此处找到有关此的文档。请参阅第 3.2.3.2 和 3.2.3.3 节。

factory-method用于指向遗留代码中可用于创建 bean 的静态方法。

与使用静态工厂方法创建 bean 非常相似,是使用实例(非静态)工厂方法,其中调用工厂中现有 bean 的工厂方法来创建新 bean。

这是factory-bean为了什么。

于 2013-09-12T19:18:14.417 回答
2

FactoryBean用作其他 bean/对象的工厂。它不能用作 bean 本身。

factory-method用于定义应用于创建此 bean 的方法(而不是调用构造函数)。具有工厂方法的 bean 可以用作 bean 本身。

Spring 可以使用许多不同的工厂类型创建 bean 实例。如果您想集成绑定到特定类型的库/遗留类,这很有用。

于 2013-09-12T19:18:30.613 回答
1

在spring中我们使用工厂方法,因为在java中预定义类和一些使用定义类没有提供直接创建其他类的对象有一些抽象类我们不能创建对象但是在类里面有方法像Calendar类我们不能创建Calendar类的对象

Calendar cal = new Calendar(); 

这是错误的,它给出错误,但它提供了getInstance()我们可以调用该方法的方法,我们可以实例化该类

例子:

Calendar cal=Calendar.getInstance();  

那时我们在 spring 示例中使用工厂方法是正确的:

<bean id="cal" class="Calendar" factory-method="getInstance">
于 2018-11-06T18:28:32.003 回答