不少朋友讨论spring配置时认为spring配置中只能静态的设置一些参数(典型情况如数据库配置, 定时器配置等)导致不方便, 其实spring已经提供了非常便利的方式来实现动态spring配置, 我们要做的只是实现一个自己的 Factory Bean , 来看一下 Factory Bean 接口的定义

创新互联是一家专注于成都网站制作、网站设计与策划设计,吉木乃网站建设哪家好?创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:吉木乃等地区。吉木乃做网站价格咨询:028-86922220
- /**//**   
 
- * Interface to be implemented by objects used within a BeanFactory   
 
- * that are themselves factories. If a bean implements this interface,   
 
- * it is used as a factory, not directly as a bean.   
 
- *   
 
- * <p><b>NB: A bean that implements this interface cannot be used   
 
- * as a normal bean.</b> A FactoryBean is defined in a bean style,   
 
- * but the object exposed for bean references is always the object   
 
- * that it creates.    
 
- * <p>FactoryBeans can support singletons and prototypes, and can   
 
- * either create objects lazily on demand or eagerly on startup.   
 
- *   
 
- * <p>This interface is heavily used within the framework, for   
 
- * example for the AOP ProxyFactoryBean or JndiObjectFactoryBean.   
 
- * It can be used for application components, but this is not common   
 
- * outside of infrastructure code.   
 
- *   
 
- * @author Rod Johnson   
 
- * @author Juergen Hoeller   
 
- * @since 08.03.2003   
 
- * @see org.springframework.beans.factory.BeanFactory   
 
- * @see org.springframework.aop.framework.ProxyFactoryBean   
 
- * @see org.springframework.jndi.JndiObjectFactoryBean   
 
- */   
 
- public interface FactoryBean ...{     
 
-  /**//**   
 
-  * Return an instance (possibly shared or independent) of the object   
 
-  * managed by this factory. As with a BeanFactory, this allows   
 
-  * support for both the Singleton and Prototype design pattern.   
 
-  * <p>If this method returns <code>null</code>, the factory will consider   
 
-  * the FactoryBean as not fully initialized and throw a corresponding   
 
-  * FactoryBeanNotInitializedException.   
 
-  * @return an instance of the bean (should not be <code>null</code>;   
 
-  * a <code>null</code> value will be considered as an indication of   
 
-  * incomplete initialization)   
 
-  * @throws Exception in case of creation errors   
 
-  * @see FactoryBeanNotInitializedException   
 
-  */   
 
-  Object getObject() throws Exception;     
 
-  /**//**   
 
-  * Return the type of object that this FactoryBean creates, or <code>null</code>   
 
-  * if not known in advance. This allows to check for specific types   
 
-  * of beans without instantiating objects, for example on autowiring.   
 
-  * <p>For a singleton, this should try to avoid singleton creation   
 
-  * as far as possible; it should rather estimate the type in advance.   
 
-  * For prototypes, returning a meaningful type here is advisable too.   
 
-  * <p>This method can be called <i>before</i> this FactoryBean has   
 
-  * been fully initialized. It must not rely on state created during   
 
-  * initialization; of course, it can still use such state if available.   
 
-  * <p><b>NOTE:</b> Autowiring will simply ignore FactoryBeans that return   
 
-  * <code>null</code> here. Therefore it is highly recommended to implement   
 
-  * this method properly, using the current state of the FactoryBean.   
 
-  * @return the type of object that this FactoryBean creates,   
 
-  * or <code>null</code> if not known at the time of the call   
 
-  * @see ListableBeanFactory#getBeansOfType   
 
-  */   
 
-  Class getObjectType();     
 
-  /**//**   
 
-  * Is the bean managed by this factory a singleton or a prototype?   
 
-  * That is, will <code>getObject()</code> always return the same object   
 
-  * (a reference that can be cached)?   
 
-  * <p><b>NOTE:</b> If a FactoryBean indicates to hold a singleton object,   
 
-  * the object returned from <code>getObject()</code> might get cached   
 
-  * by the owning BeanFactory. Hence, do not return <code>true</code>   
 
-  * unless the FactoryBean always exposes the same reference.   
 
-  * <p>The singleton status of the FactoryBean itself will generally   
 
-  * be provided by the owning BeanFactory; usually, it has to be   
 
-  * defined as singleton there.   
 
-  * @return if this bean is a singleton   
 
-  * @see #getObject()   
 
-  */   
 
-  boolean isSingleton();   
 
- }  
 
看了以后发现, Factory Bean 用于在spring容器中创建其他的Bean, 我们平时用得最多的 JndiObjectFactory Bean, hibernate 的 LocalSessionFactory Bean 都是 Factory Bean 的具体实现, 既然如此, 读取动态配置就变得易如反掌了, 假如我们要实现动态读取数据库配置的功能, 拿使用率***的 BasicDatasource 为例, 简单的实现一个 BasicDatasource Factory Bean 如下即可
- public class BasicDataSourceFactoryBean implements FactoryBean ...{     
 
-   public Object getObject() throws Exception ...{     
 
-    BasicDataSource dataSource = new BasicDataSource();   
 
-   // 读取外部配置, 设置到 dataSource 中 ...     
 
-   return dataSource;     
 
-  }     
 
-      
 
-  public Class getObjectType() ...{     
 
-   return BasicDataSource.class;    
 
-  }     
 
-  public boolean isSingleton() ...{    
 
-   return true;    
 
-  }    
 
- }    
 
然后在 spring 中如此声明 
- <bean id="dataSource" class="BasicDataSourceFactoryBean ">   
 
- ... 你的配置来源   
 
- </bean>  
 
            
                当前名称:用FactoryBean让Spring配置动起来
                
                文章位置:http://www.csdahua.cn/qtweb/news23/64023.html
            
            
                网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
                                
            
                广告
                
            
            
                声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源:
                快上网