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

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

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

什么是工厂豆用于?


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

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

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

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

如果我错了请纠正?

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

FactoryBean的接口文档说明:

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

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


更新

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

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


更新2

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

 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中

      

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

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

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

  

工厂豆:
当没有静态方法但仍然想要使用非静态方法创建对象时,可以使用factory-bean完成这个技巧:

  

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

类:

 public class ServiceFactory { public static ServiceFactory getServiceFacrotyWithStaticMethod(){ return new ServiceFactory(); } public SdCard getInstanceWithOutStaticMethod(){ return new AdaptorSlot("laptop"); } } 

你可以在这里找到相关的文档 。 见3.2.3.2和3.2.3.3。

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

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

这就是factory-bean的用途。

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

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

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