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-method
的FactoryBean
,似乎它经常使用传统的单例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实例。 如果要集成绑定到特定类型的库/旧类,这将非常有用。