web-dev-qa-db-ja.com

spring factory-methodとfactory-beanの違いは何ですか?

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

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

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


与えられた返信について、私が理解したのは

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

ファクトリBeanは、ファクトリデザインパターンに基づいてオブジェクトを作成するために使用されます。

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

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

23
Sarma

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

FactoryBeanのインターフェースドキュメントの状態:

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

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


更新

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

この場合、クラスを使用する前に自分で呼び出すか、初期化を処理するラッパーを定義するか、MethodInvokingFactoryBeanなどの他のメカニズムを使用する必要があります。


更新2

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

11
Fritz
_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>  
_

_PrintableFactory.Java_のpublic Printable getPrintable()非静的メソッドであることに注意してください。一般的に、クラスのアクセス/呼び出しメソッドまたは他のリソースが必要な場合は、そのインスタンスを作成する必要があります。同様に、Beanを作成しました。 Beanの参照変数pfactoryを使用して、ファクトリメソッドgetPrintableを呼び出しています。

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

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

<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");
    }
}
10
Jagadeesh

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

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

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

これは何 factory-beanは.

3
Daniel Kaplan

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

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

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

2
micha

Javaクラスを事前定義し、一部のクラスを定義するために、他のクラスのオブジェクトを直接作成するために提供されていないため、オブジェクトを作成できない抽象クラスがありますしかし、クラスにはCalendarクラスのようなメソッドがありますが、Calendarクラスのオブジェクトを作成することはできません

_Calendar cal = new Calendar(); 
_

そのthimではエラーを与えることは間違っていますが、メソッドを提供し、メソッドを呼び出すことができ、クラスをインスタンス化することができますgetInstance()

例:

_Calendar cal=Calendar.getInstance();  
_

そのときは、春の例でファクトリーメソッドを使用しています:

_<bean id="cal" class="Calendar" factory-method="getInstance">
_
1
Hemant vyas