我是新的泉。在Bean标签中,我找到了factory-method和factory-bean属性。 factory-method和factory-bean有什么区别?
我使用factory-method来调用我的getInstance静态方法来创建单例对象。
什么是工厂bean用于?
对于给定的回复,我理解的是
Factory-method用于调用静态方法以在同一个bean类中创建对象。
Factory-bean用于根据工厂设计模式创建对象。
Ex: - 我通过传递我的蔬菜名称(在这种情况下是EggPlant)来询问来自VegetableFactory的EggPlant对象(它将返回被要求的蔬菜对象)类。
如果我错了,请更正?
答案 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
。
严格地说,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();