私は新しいスプリングスです。 Beanタグで、factory-method属性とfactory-bean属性が見つかりました。 factory-methodとfactory-beanの違いは何ですか?
Factoryメソッドを使用してgetInstance静的メソッドを呼び出し、シングルトンオブジェクトを作成しています。
Factory-beanは何に使用されますか?
与えられた返信について、私が理解したのは
ファクトリメソッドは、静的メソッドを呼び出して同じBeanクラスにオブジェクトを作成するために使用されます。
ファクトリBeanは、ファクトリデザインパターンに基づいてオブジェクトを作成するために使用されます。
例:-私は野菜の名前(この場合はEggPlant)を渡すことで、VegicFactoryからEggPlantオブジェクト(要求された野菜オブジェクトを返す)クラスを要求しています。
私が間違っている場合は修正してください?
基本的に、Factory methodとFactory設計パターンの違いは同じですが、一番下に少し注意してください。 1つは特定のクラスのインスタンスを取得するために使用されるメソッドであり、もう1つはオブジェクトを作成する完全なオブジェクトであり、そのために必要なすべてのロジックを含みます。
FactoryBean
のインターフェースドキュメントの状態:
それ自体がファクトリーであるBeanFactory内で使用されるオブジェクトによって実装されるインターフェース。 Beanがこのインターフェースを実装する場合、それは、それ自体が公開されるBeanインスタンスとして直接ではなく、オブジェクトが公開するファクトリとして使用されます。
また、このオブジェクトはBeanインスタンスとしては使用されませんが、getObject
メソッドを介したインスタンスプロバイダーとして使用されます。
FactoryBean
を介してfactory-method
の使用を検索すると、基になるインスタンスを取得するためにレガシーシングルトンBeanで非常に頻繁に使用されているようですが、このアプローチは次のような初期化メソッドをサポートしていません。たとえば、特定のプロパティセットを初期化するinit
メソッド。
この場合、クラスを使用する前に自分で呼び出すか、初期化を処理するラッパーを定義するか、MethodInvokingFactoryBean
などの他のメカニズムを使用する必要があります。
厳密に言えば、FactoryBean
は特定のタイプを管理するためのものです。 EggPlantFactory
インターフェースで定義されているVegetableFactory
メソッドはパラメーターをサポートしていないため、実際にはgetObject
ではなくFactoryBean
があります。
_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");
}
}
これに関するドキュメントはこちら にあります。セクション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インスタンスを作成できます。これは、特定の型にバインドされているライブラリ/レガシークラスを統合する場合に便利です。
Javaクラスを事前定義し、一部のクラスを定義するために、他のクラスのオブジェクトを直接作成するために提供されていないため、オブジェクトを作成できない抽象クラスがありますしかし、クラスにはCalendar
クラスのようなメソッドがありますが、Calendar
クラスのオブジェクトを作成することはできません
_Calendar cal = new Calendar();
_
そのthimではエラーを与えることは間違っていますが、メソッドを提供し、メソッドを呼び出すことができ、クラスをインスタンス化することができますgetInstance()
例:
_Calendar cal=Calendar.getInstance();
_
そのときは、春の例でファクトリーメソッドを使用しています:
_<bean id="cal" class="Calendar" factory-method="getInstance">
_