明確な目標
この記事が解決したい問題について簡単に説明しましょう。Springを使用して春にBeanインスタンスを作成する方法ではなく、Beanの作成プロセスを開発者に転送する方法について説明します。
明確な思考
Beanインスタンスの作成方法:
1)コンストラクターを介して(パラメーターの有無にかかわらず)
方法: <bean id=""/>
2)静的工場法を介して
方法: <bean id="" factory-method="静态工厂方法"/>
注:Factoryクラスインスタンスは作成されていません
3)Instance Factory Method(非静的な方法)を介して
方法:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
注:Factoryクラスインスタンスが作成されます
実用的な方法
例1 :
必要:
1 Bean.xmlがロードされているときにBeanをインスタンス化したくありませんが、搭載されたBean.xmlをインスタンス化されたオブジェクトから分離したいと思います。
2シングルトンビーンを実装します
上記の状況では、豆はファクトリーメソッドを介して作成できます。
このようにして、bean.xmlがロードされると、Beanは直接インスタンス化されませんが、工場で言及された方法が呼び出された場合にのみ、真にインスタンス化され始めます。
実装:Spring Factory-MethodからSingleton Beanを作成します
最初に静的インナークラスを通してシングルトンオブジェクトを作成します
パッケージcom.spring.test.factorymethod; public class stage {public void perform(){system.out.println( "show start ..."); } private stage(){} private static class stagesingletonholder {static stage instance = new stage(); } public static stage getInstance(){return stagesingletonholder.instance; }}Spring構成ファイルgetInstanceで読み込み方法を指定します
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframework.org/schema/beans" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "
アプリケーションコンテキストで豆を呼び出すことにより、インスタンスを取得します
パッケージcom.spring.test.factorymethod; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontextextext; public context ctx = ctx = ctx = begs){publictext ctx = new ne ne ne ne new classPathXMLApplicationContext( "bean.xml");ステージステージ=((stage)ctx.getbean( "thestage")); //。getInstance(); stage.perform(); }}実行結果
2015年1月24日午後6時38:18 pm org.springframework.context.support.abstractapplicationcontext preparerefresh情報:reshing org.springframework.context.support.classpathxmlapplicationcontext@512dbd1a:起動日[Sat Jan 24 18:38:18 CST 2015];コンテキストのルートhierarchyjan 24、2015 6:38:19 pm org.springframework.beans.factory.xml.xml.xml.xml.definitionReader loadbeandefinitions情報:クラスパスリソース[Bean.xml]からのXML Bean定義のロードspringframework.beans.factory.support.defaultlistablebeanfactory preintantiatinglinglutons情報:org.springframework.factory.support.defaultlistablebeanfactory@2d1879ea:suptort.defaultlistablebeanfactory@asteding dukd [duke、duke、duke、duke、duke、duke、duke、duke、defaultlistablebeanfactory@2d1879ea工場のルート階層のパフォーマンスが始まります...
ファクトリーメソッド作成豆の紹介
1.静的工場法を使用してBeanを作成します
静的工場法を使用してBeanインスタンスを作成する場合、クラス属性も指定する必要がありますが、この時点では、クラス属性はBeanインスタンスを指定する実装クラスではなく、静的工場クラスです。 Springは、Beanインスタンスを作成するために使用する工場を知る必要があるためです。さらに、Factory-Methodを使用して、静的ファクトリーメソッド名を指定する必要があります。 Springは、beanインスタンスを返すために静的工場法(パラメーターのセットが含まれる場合がある)を呼び出します。指定されたBeanインスタンスが取得されると、春の後の処理ステップは、通常の方法を使用してBeanインスタンスを作成するのとまったく同じです。静的な工場法を使用して豆を作成する場合、このファクトリメソッドは静的でなければならないことに注意してください。この一節は少しめまいがしますが、あまり言わずに、コードを追加してください。
最初にインターフェイスを定義すると、静的メソッドがインターフェイスのインスタンスを作成します。
パブリックインターフェイスアニマル{public void sayshello();}インターフェイスの2つの実装クラスを次に示します。
パブリッククラスの猫は動物を実装しています{プライベート文字列msg; //依存関係インジェクション中に必要なセッターメソッドpublic void setmsg(string msg){this.msg = msg; } @Override public void sayshello(){system.out.println(msg + "、meow〜emow〜"); }}パブリッククラスの犬は動物を実装します{private string msg; //依存関係インジェクション中に必要なセッターメソッドpublic void setmsg(string msg){this.msg = msg; } @Override public void sayshello(){system.out.println(msg + "、strong〜strong〜"); }}以下のAnimalFactory Factoryには、getAnimalの静的な方法が含まれています。これにより、合格したパラメーターに基づいて作成するオブジェクトが決定されます。これは、典型的な静的工場の設計パターンです。
public clas animalfactory {public static animal getanimal(string type){if( "cat" .equalsignorecase(type)){return new Cat(); } else {return new Dog(); }}}SpringがAnimalFactoryを使用して動物オブジェクトを生成することを指定する必要がある場合は、Spring構成ファイルで以下を構成できます。
<! - getAnimalFactoryのgetAnimalメソッドを構成してCATを生成する - > <bean id = "cat" Factory-method = "getAnimal"> <! - 静的工場法のパラメーターを構成します。 value = "cat" /> < /bean> <! - getanimalactoryのgetanimalメソッドを構成して犬を生成する - > <bean id = "dog"ファクトリー - メソッド= "getAnimal"> <! - 静的ファクトリーメソッドのパラメーターを構成します。 setter-> <Property name = "msg" value = "dog" /> < /bean>
上記の構成から、猫と犬の2つの豆構成のクラスと工場の測定は、同じ静的工場クラスと同じ静的工場法を使用して両方のインスタンスが生成されるため、まったく同じであることがわかります。この静的ファクトリメソッドに指定されたパラメーターが異なるというだけで、<constructor-arg />要素を使用して、静的工場法のパラメーターを指定します。
2つのBeanインスタンスを取得するメインプログラムの方法は、猫と犬の犬と犬のままです。スプリングコンテナのgetbean()を呼び出すだけです。
public class test {public static void main(string args []){applicationContext context = new classpathxmlapplicationContext( "applicationContext.xml");動物a1 = context.getbean( "cat"、animal.class); a1.sayhello();動物a2 = context.getbean( "dog"、animal.class); a2.sayhello(); }}出力結果:
<code> cat、meow〜emow〜 dog、strong〜strong〜 </code>
静的工場法を使用してインスタンスを作成する場合、工場クラスとインスタンスを生成する静的工場メソッドを提供する必要があります。静的ファクトリーメソッドを使用してインスタンスを作成するときは、次の変更をSpring構成ファイルに変更する必要があります。
クラス属性は、Beanインスタンスの実装クラスではなく、Beanインスタンスを生成する静的な工場クラスです。
Factory-Methodを使用して、Beanインスタンスを生産するための静的な工場法を指定します
静的工場法にパラメーターが必要な場合は、<constructor-arg />要素を使用して構成します
Springが静的ファクトリーメソッドを使用してBeanインスタンスを作成することを指定すると、Springは最初に構成ファイルを解析し、構成ファイルで指定された情報に基づいて反射を介して静的ファクトリークラスの静的工場メソッドを呼び出し、Static Factoryメソッドの戻り値をBeanインスタンスとして使用します。このプロセスでは、SpringはBeanインスタンスの作成に責任を負いなくなり、Beanインスタンスはユーザーが提供する静的工場メソッドによって提供されます。
2。インスタンスファクトリーメソッドを使用してBeanを作成します
Instance Factoryメソッドは、静的工場法とは少し異なります。静的工場メソッドを呼び出すには、工場クラスの使用のみが必要であり、インスタンス工場メソッドを呼び出す必要があります。工場インスタンスを使用する必要があります。したがって、Spring構成には1つの違いがあります。静的ファクトリクラスを指定する静的ファクトリメソッドを構成し、ファクトリーインスタンスを指定するためにインスタンスファクトリーメソッドを構成します。上記の同じ例は、動物工事を次のように変更します。
public clas AnimalFactory {public Animal getAnimal(string type){//ここでは、静的キーワードは( "cat" .equalsignorecase(type)){return new cat(); } else {return new Dog(); }}}スプリングファイルは次のように変更されています。
<! - ファクトリークラスを最初に構成 - > <bean id = "Animalfactory" /> <! - ここでは、工場ビーンを使用して工場クラスオブジェクトを指定します - > <bean id = "cat"ファクトリービーン= "AnimalFactory" Factory-method = "getAnimal"> <! - また、ファクトリー - マシェ= < value = "cat" /> < /bean> <bean id = "dog" Factory-bean = "AnimalFactory" Factory-Method = "getAnimal"> <constructor-arg value = "dog" /> <プロパティ名= "msg" value = " /> < /bean> < /bean>
テストクラスを変更する必要はなく、出力の結果は上記と同じです。
多くの場合、<bean id = "bean1" class = "..." />は、Beanを定義するために使用されます。このようにして、スプリングはデフォルトのパラメーターレスコンストラクターを呼び出して、Beanインスタンスを作成します。さらに、工場を使用してBeanインスタンスを作成してBeanの作成と使用を分離し、Beanの作成作業を工場に引き渡して完了することもできます。
工場豆を構成するには3つの方法があります。
抽象インターフェイス:
public interface imusicbox {public void play(); } 1.静的工場法の豆の例を取得します
工場のカテゴリ:
public class musicboxfactory {public static imusicbox createmusicbox(){return new imusicbox(){public void play(){system.out.println( "play piano ..."); }}; }}構成ファイル:
<bean id = "musicbox" factory-method = "createmusicbox" />
テストクラス:
public static void main(string [] args){applicationContext ctx = new classpathxmlapplicationContext( "bean-config.xml"); imusicbox musicbox =(imusicbox)ctx.getBean( "Musicbox"); musicbox.play(); }2。工場インスタンスの方法は、Beanインスタンスを取得します
工場のカテゴリ:
public class musicboxfactory {public imusicbox createmusicbox(){// static修正なしnew imusicbox(){public void play(){system.out.println( "play piano ..."); }}; }}構成ファイル:
<bean id = "factorybean" /> <bean id = "musicbox" factory-bean = "factorybean" factory-method = "createmusicbox" />
「ファクトリービーン」属性はファクトリービーンを指定し、「ファクトリーメソッド」属性は、ビーンインスタンスを取得するためのファクトリーメソッドを指定します。
テストクラス:
public static void main(string [] args){applicationContext ctx = new classpathxmlapplicationContext( "bean-config.xml"); imusicbox musicbox =(imusicbox)ctx.getBean( "Musicbox"); musicbox.play(); } 3。工場クラスはorg.springframework.beans.factory.facotrybeanインターフェイスを実装しています
工場のカテゴリ:
Import org.springframework.beans.factory.factorybean; Public class MusicBoxFactory2 Implements FactoryBean {public Object getObject()throws Exception {return new imusicbox(){public void play(){system.out.println( "play piano ..."); }}; } public class getObjectType(){return imusicbox.class; } public boolean issingleton(){return false; }}構成ファイル:
<bean id = "musicbox"/>
テストクラス:
public static void main(string [] args){applicationContext ctx = new classpathxmlapplicationContext( "bean-config.xml"); // Factory Imusicbox MusicBoxの「製品」を追加して返しません=(imusicbox)ctx.getBean( "Musicbox"); musicbox.play(); // Factoryクラスインスタンスオブジェクトを追加して返しますobj = ctx.getBean( "&Musicbox"); System.out.println(obj.getClass()。getName()); }工場のインターフェイスを実装するクラスは通常の豆とは見なされません。Springは自動的に検出され、GetObjectメソッドを呼び出してBeanインスタンスを取得します。
要約します
これは、Spring Factory Methodsのインスタンス化ビーンインスタンスの紹介の終わりです。欠点がある場合は、メッセージを残すことができます。このサイトへのご支援をありがとうございました!