spring factory-method和factory-bean有什么区别?

时间:2013-09-12 19:09:55

标签: java spring spring-mvc spring-social springsource

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

我使用factory-method来调用我的getInstance静态方法来创建单例对象。

什么是工厂bean用于?


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

Factory-method用于调用静态方法以在同一个bean类中创建对象。

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

Ex: - 我通过传递我的蔬菜名称(在这种情况下是EggPlant)来询问来自VegetableFactory的EggPlant对象(它将返回被要求的蔬菜对象)类。

如果我错了,请更正?

6 个答案:

答案 0 :(得分:16)

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.

Printable.java

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

A.java

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  
    }  
}  

的applicationContext.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() PrintableFactory.java非静态方法。通常,如果我们想要访问/调用方法或类的其他资源,我们必须创建它的实例。同样,我们创建了bean。使用bean的引用变量pfactory,我们调用工厂方法getPrintable

答案 1 :(得分:10)

Factory方法 Factory 设计模式之间的区别基本相同,底部有一点注释。虽然一个是用于获取特定类的实例的方法,但另一个是负责创建对象的完整对象,包括执行此操作所需的所有逻辑。

FactoryBean的界面文档声明:

  

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

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


更新

factory-method上搜索FactoryBean的使用,似乎它经常使用传统的单例bean来获取底层实例,但这种方法不支持初始化方法,例如,初始化给定属性集的init方法。

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


更新2

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

答案 2 :(得分:10)

<强>工厂方法:
正如大家已经解释的那样, factory-method 用于告诉spring使用factory方法来实例化对象。

注意:静态方法是必需的,否则抛出异常。

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

<强>工厂豆:
当没有静态方法但仍然想要使用非静态方法创建对象时,可以使用 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");
    }
}

答案 3 :(得分:3)

您可以找到documentation about this here。见3.2.3.2和3.2.3.3。

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

  

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

这是factory-bean的用途。

答案 4 :(得分:2)

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

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

Spring可以使用许多不同的工厂类型创建bean实例。如果要集成绑定到特定类型的库/旧类,这非常有用。

答案 5 :(得分:1)

在春季,我们使用工厂方法,因为在Java预定义类中,有些使用define类,那里没有提供直接创建其他类的对象的方法,有些抽象类我们无法创建对象,但是在类的旁边是方法,就像TransientVector类一样,我们无法创建Calendar类的对象

Calendar

该thime的给出错误是错误的,但是它提供了方法Calendar cal = new Calendar(); ,我们可以调用该方法,并可以实例化该类

示例:

getInstance()

那是正确的,我们在春季示例中使用了工厂方法:

Calendar cal=Calendar.getInstance();