28

私は新しいスプリングスです。Bean タグで、factory-method 属性と factory-bean 属性を見つけました。factory-method と factory-bean の違いは何ですか?

factory-method を使用して getInstance 静的メソッドを呼び出し、シングルトン オブジェクトを作成しています。

factory-bean は何に使用されますか?


与えられた回答に対して、私が理解したのは

ファクトリ メソッドは、静的メソッドを呼び出して同じ Bean クラスにオブジェクトを作成するために使用されます。

factory-bean は、工場の設計パターンに基づいてオブジェクトを作成するために使用されます。

例:-野菜の名前(この場合はEggPlant)を渡すことにより、VegetableFactory(要求された野菜オブジェクトを返す)クラスからEggPlantオブジェクトを要求しています。

私が間違っている場合は修正してください。

4

6 に答える 6

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

Notice that public Printable getPrintable() of PrintableFactory.java is a non-static method. Generally if we want access/call method or other resources of the a class we have to create it's instance. Similarly in that we created it bean. using bean's reference variable pfactory we are calling the factory method getPrintable.

于 2015-11-21T09:21:37.233 に答える
16

これは基本的にFactory メソッドFactory設計パターンの違いと同じですが、下部に少し注意が必要です。1 つは特定のクラスのインスタンスを取得するために使用されるメソッドですが、もう 1 つはオブジェクトの作成を担当する本格的なオブジェクトであり、そのために必要なすべてのロジックを含みます。

FactoryBeanのインターフェイス ドキュメントには次のように記載されています。

それ自体がファクトリーである BeanFactory 内で使用されるオブジェクトによって実装されるインターフェース。Bean がこのインターフェースを実装する場合、それ自体が公開される Bean インスタンスとして直接ではなく、公開するオブジェクトのファクトリとして使用されます。

また、このオブジェクトは Bean インスタンスとしてではなく、そのgetObjectメソッドを介してインスタンス プロバイダーとして使用されます。


アップデート

の使用を検索するとfactory-methodFactoryBean基になるインスタンスを取得するためにレガシー シングルトン Bean で頻繁に使用されているようですが、このアプローチは、たとえば、init特定のセットを初期化するメソッドなどの初期化メソッドのサポートを提供しません。プロパティの。

この場合、クラスを使用する前に自分で呼び出すか、初期化を処理するラッパーを定義するか、MethodInvokingFactoryBean.


更新 2

厳密に言えば、aFactoryBeanは特定の型を管理するためのものです。実際には、インターフェースによって定義されたメソッドがパラメーターをサポートしていないため、EggPlantFactoryではなく があります。VegetableFactorygetObjectFactoryBean

于 2013-09-12T19:18:37.800 に答える
10

factory-method:
誰もが既に説明したように、factory-methodは、オブジェクトをインスタンス化するために factory メソッドを使用するようスプリングに指示するために使用されます。

注: 静的メソッドは必須です。それ以外の場合は例外がスローされます。

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

factory-bean:
静的メソッドがなく、非静的メソッドを使用してオブジェクトを作成したい場合、factory-beanを使用して実行できるトリックを次に示します。

<bean id="instanceWithOutStaticMethod" factory-bean="serviceFactory" factory-method="getInstanceWithOutStaticMethod" />

注: 上記のスプリング定義ではクラス属性は必要ありません。

クラス:

public class ServiceFactory {

    public static ServiceFactory getServiceFacrotyWithStaticMethod(){
        return new ServiceFactory();
    }

    public SdCard getInstanceWithOutStaticMethod(){
        return new AdaptorSlot("laptop");
    }
}
于 2015-05-25T12:51:12.597 に答える
3

これに関するドキュメントはこちらにあります。セクション 3.2.3.2 および 3.2.3.3 を参照してください。

factory-methodBean の作成に使用できるレガシー コードの静的メソッドを指すために使用されます。

静的ファクトリ メソッドを使用して Bean を作成するのと非常に似ているのは、インスタンス (非静的) ファクトリ メソッドを使用することです。この場合、ファクトリから既存の Bean のファクトリ メソッドが呼び出されて、新しい Bean が作成されます。

これがfactory-bean目的です。

于 2013-09-12T19:18:14.417 に答える
2

FactoryBeanは、他の Bean/オブジェクトのファクトリーとして使用されますBean 自体としては使用できません。

を使用して、このfactory-methodBean を作成するために使用するメソッドを定義できます (コンストラクターを呼び出す代わりに)。ファクトリ メソッドを持つ Bean は、Bean 自体として使用できます。

Spring は、さまざまなファクトリ タイプを使用して Bean インスタンスを作成できます。これは、特定のタイプにバインドされているライブラリ/レガシー クラスを統合する場合に便利です。

于 2013-09-12T19:18:30.613 に答える