zoukankan      html  css  js  c++  java
  • 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.           
  • 相关阅读:
    HDU 5521 Meeting
    HDU 5170 GTY's math problem
    HDU 5531 Rebuild
    HDU 5534 Partial Tree
    HDU 4101 Ali and Baba
    HDU 5522 Numbers
    HDU 5523 Game
    ZUFE OJ 2301 GW I (3)
    POJ 2398 Toy Storage
    POJ 2318 TOYS
  • 原文地址:https://www.cnblogs.com/chenying99/p/2698878.html
Copyright © 2011-2022 走看看