badqiu

XPer
随笔 - 46, 文章 - 3, 评论 - 195, 引用 - 0
数据加载中……

Holder模式

(本方法属于作者经验总结出该模式)

Holder模式的主要功能是将一些Bean可以转为静态方法调用.方便使用.

适用于一些系统只存在单例(singleton)并且 十分常用 的基础服务对象.这些基础服务如果每次使用spring注入,只会增加无谓的代码及一些不确定性.

示例如下:

BeanValidatorHolder.validate(bean) // HibernateValidator一般系统只有一个
CacheHolder.get("key") //如Memcached,应用系统也只有一个对象
ApplicationContextHolder.getBean("userInfoService");

与singleton相比特点

  • 一个Holder只能持有一个对象
  • Holder一般是持有接口,所以你可以方便的改变实现
  • 配合spring完成Holder初始化

示例1.CacheHolder?

用于持有Cache对象

1.1在spring中初始化

<bean class="cn.org.rapid_framework.util.holder.CacheHolder">
    <property name="cache" ref="memcacheCacheImpl"/>
</bean>

1.2使用 CacheHolder?使用

CacheHolder.add("key","cache_value","1h");
//do something

1.3实现

public class CacheHolder implements InitializingBean{
    private static Cache cache;
   
public void afterPropertiesSet() throws Exception {         if(cache == null) throw new IllegalStateException("not found 'cache' for CacheHolder ");     }             public void setCache(Cache c) {         if(cache != null) throw new IllegalStateException("CacheHolder already holded 'cache'");         cache = c;     }
   
public static Cache getCache(){         return cache;     }
//省略了其它N多cache静态方法    
public static void add(String key, Object value, String expiration) {         cache.add(key, value, parseDuration(expiration));     }
   
public static void cleanHolder() {         cache = null;     }        }

其它可以存在的Holder

holder 功能
BeanValidatorHolder 用于持有Hibernate Validator
SpringValidatorHolder 用于持有Spring Validator
ApplicationContextHolder 用于持有Spring ApplicationContext?
CacheHolder 用于持有Cache
MessagePublisherHodler 用于持有类似JMS消息中心的消息发送
MessageSourceHolder 持用MessageSource?,用于国际化
MailerHolder 用于邮件发送的Mailer
ConfigHolder 用于持有配置,需要动态刷新的参数使用,请查看文章保持类的无状态
SecurityManagerHolder 用于权限控制的SecurityManager

posted on 2010-06-22 22:01 badqiu 阅读(2858) 评论(3)  编辑  收藏

评论

# re: Holder模式  回复  更多评论   

^_^holder随好用,但是不利于动态插拔,在OSGi的环境中,static也存在着陷阱。
2010-06-23 10:31 | 临远

# re: Holder模式  回复  更多评论   

一直反OSGI,因为OSGI在做容器方面会比较好,但对于WEB应用并不适用,因为OSGI与应用无状态相违背。 只要做到应用无状态,要做模块化划分是很容易的一件事。

不需要OSGI搞得这么复杂.
2010-06-23 10:41 | badqiu

# re: Holder模式  回复  更多评论   

OSGi引入了非常大的难度和风险,带来的好处也很明显。仁者见仁,智者见智了。如果用ThreadLocal而不是static作为Holder的媒介,就可以避免OSGi这类多classloader环境带来的隐形问题。
2010-06-23 11:09 | 临远

只有注册用户登录后才能发表评论。


网站导航: