• 5.1:FactoryBean的使用


    5.1  FactoryBean的使用

     

    一般情况下,Spring通过反射机制利用beanclass属性指定实现类来实例化bean 。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。 

     

    FactoryBean接口对于Spring框架来说占有重要的地位,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 getObject():

      返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中。

      boolean isSingleton():

      返回由FactoryBean创建的bean实例的作用域是singleton还是prototype。

      Class<T> getObjectType():

      返回FactoryBean创建的bean类型。

      当配置文件中<bean>class属性配置的实现类是FactoryBean时,通过 getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方法。

    如:如果使用传统方式配置下面Car<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后,就可以在配置文件中使用下面这种自定义的配置方式配置Car Bean了: 

     

    <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容器就调用接口方法CarFactoryBean#getObject()方法返回。如果希望获取CarFactoryBean的实例,则需要在使用getBean(beanName) 方法时在beanName前显示的加上 "&" 前缀,例如getBean("&car")。

     

  • 相关阅读:
    Revolving Digits[EXKMP]
    字符加密Cipher(bzoj 1031)
    Hotaru's problem
    1089 最长回文子串 V2(Manacher算法)
    3172: [Tjoi2013]单词
    3689: 异或之
    3942: [Usaco2015 Feb]Censoring [KMP]
    2795: [Poi2012]A Horrible Poem
    GT考试(bzoj 1009)
    NOIP2016提高组解题报告
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3582969.html
Copyright © 2020-2023  润新知