Spring中的FactoryBean

1.概述 
         Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现,下面简单分析FactoryBean的用法。 

2.实例 
以下SimpleFactoryBean类实现了FactoryBean接口中的三个方法。 并将该类配置在XML中。 
Java代码    收藏代码
  1. public class SimpleFactoryBean implements FactoryBean {  
  2.         private boolean flag;  
  3.       
  4.         public Object getObject() throws Exception {  
  5.             if (flag) {  
  6.                 return new Date();  
  7.             }  
  8.             return new String("false");  
  9.         }  
  10.       
  11.         @SuppressWarnings("unchecked")  
  12.         public Class getObjectType() {  
  13.             return flag ? Date.class : String.class;  
  14.         }  
  15.       
  16.         public boolean isSingleton() {  
  17.             return false;  
  18.         }  
  19.       
  20.         public void setFlag(boolean flag) {  
  21.             this.flag = flag;  
  22.         }  
  23.     }  
  24.       
  25.     <bean id="factoryBeanOne" class="com.study.demo.factorybean.SimpleFactoryBean" >  
  26.         <property name="flag">  
  27.             <value>true</value>  
  28.         </property>  
  29.     </bean>  
  30.       
  31.     <bean id="factoryBeanTwo" class="com.study.demo.factorybean.SimpleFactoryBean" >  
  32.         <property name="flag">  
  33.             <value>false</value>  
  34.         </property>  
  35.     </bean>  
  36.       
  37.     public class MainTest {  
  38.         public static void main(String[] args) {  
  39.             Resource res = new ClassPathResource("bean.xml");  
  40.             BeanFactory factory = new XmlBeanFactory(res);  
  41.             System.out.println(factory.getBean("factoryBeanOne").getClass());  
  42.             System.out.println(factory.getBean("factoryBeanTwo").getClass());  
  43.         }  
  44.     }  


通过简单的测试可知,该类输出如下: 
class java.util.Date 
class java.lang.String 
也就是说,容器通过getBean方法返回的不是FactoryBean本身,而是FactoryBean实现类中getObject()方法所返回的对象。 

3.FactoryBean的扩展应用 
以Spring集成 ehcache 为例,看下org.springframework.cache.ehcache.EhCacheManagerFactoryBean类与org.springframework.cache.ehcache.EhCacheFactoryBean类。EhCacheManagerFactoryBean类中的getObject()和getObjectType() 方法返回的如下: 
Java代码    收藏代码
  1. public Object getObject() {  
  2.             return this.cacheManager;  
  3.         }  
  4.       
  5.     public Class getObjectType() {  
  6.             return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);  
  7.         }  


EhCacheFactoryBean类中的getObject()和getObjectType() 方法返回的如下: 
Java代码    收藏代码
  1. public Object getObject() {  
  2.             return this.cache;  
  3.         }  
  4.       
  5.         public Class getObjectType() {  
  6.             return (this.cache != null ? this.cache.getClass() : Ehcache.class);  
  7.         }  

有了这两个FactoryBean,在Spring容器中使用ehcache就变得很简单了。配置如下: 
Java代码    收藏代码
  1. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
  2.               <property name="configLocation">    
  3.               <value>classpath:ehcache.xml</value>    
  4.               </property>    
  5.         </bean>    
  6.       
  7.         <bean id="levelOneCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">    
  8.               <property name="cacheManager">    
  9.                     <ref local="cacheManager" />    
  10.               </property>    
  11.               <property name="cacheName">    
  12.                     <value>levelOneCache</value>    
  13.               </property>    
  14.         </bean>  

应用代码如下: 
Java代码    收藏代码
  1. public class MainTest {  
  2.             public static void main(String[] args) {  
  3.                 Resource res = new ClassPathResource("bean.xml");  
  4.                 BeanFactory factory = new XmlBeanFactory(res);  
  5.                 //取到CacheManager类的实例   
  6.                 CacheManager cacheManager = (CacheManager) factory  
  7.                         .getBean("cacheManager");  
  8.                 //取到Cache类的实例   
  9.                 Cache levelOneCache = cacheManager.getCache("levelOneCache");  
  10.             }  
  11.         }  
  12.           

你可能感兴趣的:(FactoryBean)