`
longding
  • 浏览: 2526 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring中的FactoryBean

阅读更多
1.概述
         Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现,下面简单分析FactoryBean的用法。
2.实例
以下SimpleFactoryBean类实现了FactoryBean接口中的三个方法。 并将该类配置在XML中。
    public class SimpleFactoryBean implements FactoryBean {  
            private boolean flag;  
          
            public Object getObject() throws Exception {  
                if (flag) {  
                    return new Date();  
                }  
                return new String("false");  
            }  
          
            @SuppressWarnings("unchecked")  
            public Class getObjectType() {  
                return flag ? Date.class : String.class;  
            }  
          
            public boolean isSingleton() {  
                return false;  
            }  
          
            public void setFlag(boolean flag) {  
                this.flag = flag;  
            }  
        }  
          
        <bean id="factoryBeanOne" class="com.study.demo.factorybean.SimpleFactoryBean" >  
            <property name="flag">  
                <value>true</value>  
            </property>  
        </bean>  
          
        <bean id="factoryBeanTwo" class="com.study.demo.factorybean.SimpleFactoryBean" >  
            <property name="flag">  
                <value>false</value>  
            </property>  
        </bean>  
          
        public class MainTest {  
            public static void main(String[] args) {  
                Resource res = new ClassPathResource("bean.xml");  
                BeanFactory factory = new XmlBeanFactory(res);  
                System.out.println(factory.getBean("factoryBeanOne").getClass());  
                System.out.println(factory.getBean("factoryBeanTwo").getClass());  
            }  
        }  

通过简单的测试可知,该类输出如下:
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() 方法返回的如下:
    public Object getObject() {  
                return this.cacheManager;  
            }  
          
        public Class getObjectType() {  
                return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);  
            }  

EhCacheFactoryBean类中的getObject()和getObjectType() 方法返回的如下:
    public Object getObject() {  
                return this.cache;  
            }  
          
            public Class getObjectType() {  
                return (this.cache != null ? this.cache.getClass() : Ehcache.class);  
            }  

有了这两个FactoryBean,在Spring容器中使用ehcache就变得很简单了。配置如下:
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
                  <property name="configLocation">    
                  <value>classpath:ehcache.xml</value>    
                  </property>    
            </bean>    
          
            <bean id="levelOneCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">    
                  <property name="cacheManager">    
                        <ref local="cacheManager" />    
                  </property>    
                  <property name="cacheName">    
                        <value>levelOneCache</value>    
                  </property>    
            </bean>  

应用代码如下:
public class MainTest {  
            public static void main(String[] args) {  
                Resource res = new ClassPathResource("bean.xml");  
                BeanFactory factory = new XmlBeanFactory(res);  
                //取到CacheManager类的实例   
                CacheManager cacheManager = (CacheManager) factory  
                        .getBean("cacheManager");  
                //取到Cache类的实例   
                Cache levelOneCache = cacheManager.getCache("levelOneCache");  
            }  
        }  

转自:http://kim-miao.iteye.com/blog/1299479
分享到:
评论

相关推荐

    spring中FactoryBean中的getObject()方法实例解析

    主要介绍了spring中FactoryBean中的getObject()方法实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    spring的FactoryBean增强我们的目标对象.rar

    通过FactoryBean在获取目标类的时间我们将增强的代理类给返回,使得我们调用方法的时间使用的代理类来增强,如果需要继续使用未代理的对象,则直接@Autowired 注入使用.

    Spring中的FactoryBean.rar

    Spring中的FactoryBean.rar

    详解Spring中的FactoryBean

    本篇文章主要介绍了Spring中的FactoryBean,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean

    简单了解Spring中BeanFactory与FactoryBean的区别

    主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    spring中的FactoryBean代码示例

    主要介绍了spring中的FactoryBean代码示例,涉及FactoryBean的实现等相关内容,具有一定参考价值,需要的朋友可以了解下。

    spring源码解析之FactoryBean相关测试代码demo

    spring源码解析之FactoryBean相关测试代码demo,文章中也有相关代码

    Spring中BeanFactory与FactoryBean接口的区别详解

    主要给大家介绍了关于Spring中BeanFactory与FactoryBean接口的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    深入了解Spring中的FactoryBean

    主要介绍了深入了解Spring中的FactoryBean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    精通Spring整合MyBatis:架构师的实践指南

    Spring和MyBatis的整合是Java开发中常见的架构模式,它提供了一种高效、灵活的方式来管理数据库操作和业务逻辑层。本文深入探讨了Spring和MyBatis整合的关键原理和实践要点,帮助架构师和开发者有效地利用这两个强大...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    FactoryBean代码最简实现

    这篇代码主要适用于我的博客,用来帮助理解Spring配置文件+FactoryBean的实例化过程。注意,这里是FactoryBean,而不是BeanFactory,下载资源要看清楚哈。

    factory-bean-demo.7z

    spring 自定义 FactoryBean 样例工程,可以通过这个工程通过实现FactoryBean来扩展Spring容器

    spring如何通过FactoryBean配置Bean

    主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring BeanFactory和FactoryBean区别解析

    主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    spring的详细介绍

    5. Spring中注入方式 6. 注入的数据类型 7. 创建bean实例的方式 8. Spring中Bean实例的设计 9. 创建Bean实例的时间 10. 自动装配(不建议使用) 11. 依赖检查 12. 定义IoC容器管理的javabean的生命周期回调方法 13. ...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring中的BeanFactory与FactoryBean的讲解

    今天小编就为大家分享一篇关于spring中的BeanFactory与FactoryBean的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    SpringFactoryBean:spring FactoryBean的样本,在运行时在两个bean之间进行更改

    spring FactoryBean的小样本,如何在运行时在两个bean之间进行切换。

    spring4示例代码

    spring-2 演示了外部配置文件的引入(connection),spel(spring el)表达式 ,静态工厂方式及实例工厂方式及factorybean方式创建bean, spring的生命周期及BeanPostProcessor的使用,注解方式创建bean 及使用...

Global site tag (gtag.js) - Google Analytics