Spring中的FactoryBean

太过爱你忘了你带给我的痛 2021-06-24 15:56 518阅读 0赞

1.概述

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

2.实例
以下SimpleFactoryBean类实现了FactoryBean接口中的三个方法。 并将该类配置在XML中。

  1. public class SimpleFactoryBean implements FactoryBean {
  2. private boolean flag;
  3. public Object getObject() throws Exception {
  4. if (flag) {
  5. return new Date();
  6. }
  7. return new String("false");
  8. }
  9. @SuppressWarnings("unchecked")
  10. public Class getObjectType() {
  11. return flag ? Date.class : String.class;
  12. }
  13. public boolean isSingleton() {
  14. return false;
  15. }
  16. public void setFlag(boolean flag) {
  17. this.flag = flag;
  18. }
  19. }
  20. <bean id="factoryBeanOne" class="com.study.demo.factorybean.SimpleFactoryBean" >
  21. <property name="flag">
  22. <value>true</value>
  23. </property>
  24. </bean>
  25. <bean id="factoryBeanTwo" class="com.study.demo.factorybean.SimpleFactoryBean" >
  26. <property name="flag">
  27. <value>false</value>
  28. </property>
  29. </bean>
  30. public class MainTest {
  31. public static void main(String[] args) {
  32. Resource res = new ClassPathResource("bean.xml");
  33. BeanFactory factory = new XmlBeanFactory(res);
  34. System.out.println(factory.getBean("factoryBeanOne").getClass());
  35. System.out.println(factory.getBean("factoryBeanTwo").getClass());
  36. }
  37. }

通过简单的测试可知,该类输出如下:
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() 方法返回的如下:

  1. public Object getObject() {
  2. return this.cacheManager;
  3. }
  4. public Class getObjectType() {
  5. return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);
  6. }

EhCacheFactoryBean类中的getObject()和getObjectType() 方法返回的如下:

  1. public Object getObject() {
  2. return this.cache;
  3. }
  4. public Class getObjectType() {
  5. return (this.cache != null ? this.cache.getClass() : Ehcache.class);
  6. }

有了这两个FactoryBean,在Spring容器中使用ehcache就变得很简单了。配置如下:

  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. <bean id="levelOneCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  7. <property name="cacheManager">
  8. <ref local="cacheManager" />
  9. </property>
  10. <property name="cacheName">
  11. <value>levelOneCache</value>
  12. </property>
  13. </bean>

应用代码如下:

  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. }

发表评论

表情:
评论列表 (有 0 条评论,518人围观)

还没有评论,来说两句吧...

相关阅读