弹簧工厂法和工厂豆有什么区别?

我是新泉。在Bean标签中,我找到了工厂方法和工厂bean属性。工厂方法和工厂豆有什么区别?

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

工厂豆的用途是什么?


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

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

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

例如:- 我正在通过传递我的蔬菜名称(在这种情况下为茄子)从蔬菜工厂请求一个茄子对象(这将返回被问到的蔬菜对象)类。

如果我错了,请纠正?


答案 1
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();  
}  

答.java

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

乙.java

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

可打印工厂.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>  

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


答案 2

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

FactoryBean的接口文档指出:

由BeanFactory中使用的对象实现的接口,这些对象本身就是工厂。如果 Bean 实现此接口,则它被用作要公开的对象的工厂,而不是直接用作将自身公开的 Bean 实例。

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


更新

搜索 over a 的用法,它似乎经常与遗留的单例 Bean 一起使用,以获取基础实例,但此方法不提供对初始化方法的支持,例如,初始化给定属性集的方法。factory-methodFactoryBeaninit

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


更新 2

严格来说,a 用于管理特定类型。事实上,您将拥有 一个 ,而不是 a,因为接口定义的方法不支持参数。FactoryBeanEggPlantFactoryVegetableFactorygetObjectFactoryBean


推荐