5.1:FactoryBeanの使用

7021 ワード

5.1  FactoryBeanの使用
 
一般的には、Springは、反射機構によりbeanのclass属性指定実現類を利用して、beanを実現します. .場合によっては、例示化されたbeanプロセスは比較的複雑であり、従来の方法によれば、多くの構成情報を提供する必要があり、構成の柔軟性が制限されている場合、符号化方式を採用することによって簡単なスキームが得られるかもしれない.Springはこのためにorg.Sprigframe ebork.bean.factory.FactoryBenの工場類インターフェースを提供しており、ユーザーはこのインターフェースを実現することによって、実際的なbeanの論理をカスタマイズすることができる. 
 
FactoryBeanインターフェースはSpringフレームにとって重要な位置を占めています. 自身70個以上のFactoryBeanを実現しました.それらは実用化のいくつかの複雑なbeanの詳細を隠しており、上層アプリケーションに便利をもたらしています.Springから 3.0 始まります FactoryBeanは汎型のサポートを開始しました.すなわち、インターフェース宣言はFactoryBean<T>に変更されました. の形式: 
 
1 package org.Springframework.beans.factory;  
2 public interface FactoryBean<T> {  
3    T getObject() throws Exception;  
4    Class<?> getObjectType();  
5    boolean isSingleton();  
6 }
 
このインターフェースでは、以下の3つの方法も定義されている.
  T get Object():
FactoryBeanによって作成されたbeanの例を返し、isSingleton()がtrueに戻る場合、この例はSpring容器中の単一のインスタンスキャッシュ・プールに置かれる.
  bollan isSingleton():
FactoryBeanによって作成されたbeanのインスタンスのスコープはsingletonですか?それともprototypeですか?
  クラス getObject Type():
FactoryBeanで作成したbeanタイプを返します.
 
プロファイルの「bean」のclass属性構成の実装クラスがFactoryBeanである場合、 getBean()メソッドは、FactoryBean自体ではなく、FactoryBean(zhi get Object)メソッドによって返されるオブジェクトに相当し、FactoryBen(zhi getObject)がgetBen()メソッドを代理している.
 
例えば、次のカールの<bean>を従来の方式で構成する場合、Carの各属性はそれぞれ一つの<property>要素ラベルに対応します. 
 
1 package org.Springframework.beans.factory;  
2 public interface FactoryBean<T> {  
3    T getObject() throws Exception;  
4    Class<?> getObjectType();  
5    boolean isSingleton();  
6 }
 
FactoryBeanの方式で実現すれば柔軟になります.次の例は、カンマ区切りによって、一度にCarのすべての属性に設定値を指定します. 
 1 public   class  CarFactoryBean  implements  FactoryBean<Car>  {  
 2     private  String carInfo ;  
 3     public  Car getObject ()   throws  Exception  {  
 4         Car car =  new  Car () ;  
 5         String []  infos =  carInfo .split ( "," ) ;  
 6         car.setBrand ( infos [ 0 ]) ;  
 7         car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;  
 8         car.setPrice ( Double. valueOf ( infos [ 2 ])) ;  
 9         return  car;  
10     }  
11     public  Class<Car> getObjectType ()   {  
12         return  Car. class ;  
13     }  
14     public   boolean  isSingleton ()   {  
15         return   false ;  
16     }  
17     public  String getCarInfo ()   {  
18         return   this . carInfo ;  
19     }  
20   
21     //                
22     public   void  setCarInfo ( String carInfo )   {  
23         this . carInfo  = carInfo;  
24     }  
25 }
 
 1 2     public   class  Car  {
 3         private   int maxSpeed ;
 4         private  String brand ;
 5         private   double price ;
 6         public   int  getMaxSpeed ()   {
 7             return   this . maxSpeed ;
 8         }
 9         public   void  setMaxSpeed ( int  maxSpeed )   {
10             this . maxSpeed  = maxSpeed;
11         }
12         public  String getBrand ()   {
13             return   this . brand ;
14         }
15         public   void  setBrand ( String brand )   {
16             this . brand  = brand;
17         }
18         public   double  getPrice ()   {
19             return   this . price ;
20         }
21         public   void  setPrice ( double  price )   {
22             this . price  = price;
23        }
24 }
 
このCarFactoryBeanがあれば、配置ファイルに次のようなカスタム構成を使用してCalを配置することができます. ビーンです 
 
<bean id="car" class="com.test.factorybean.CarFactoryBean"carInfo="    ,400,2000000"/>
または
<bean id="car" class="test.CarFactoryBean">
        <property name="carInfo" value="    ,400,2000000"/>
    </bean>
 
getBeanを呼び出したとき(「car」) 時,Springは反射機構によりCarFactoryBeanがFactoryBeanのインターフェースを実現していることを発見し,この時Spring容器はインターフェース方法CarFactoryBenメソッドを呼び出して戻る.CarFactoryBeanの例を取得したいなら、getBeanを使用する必要があります. 方法はbeanNameの前に表示されます.加えて を選択します プレフィックスは、例えばgetBean(\&car)である.