badqiu

          XPer
          隨筆 - 46, 文章 - 3, 評(píng)論 - 195, 引用 - 0
          數(shù)據(jù)加載中……

          Holder模式

          (本方法屬于作者經(jīng)驗(yàn)總結(jié)出該模式)

          Holder模式的主要功能是將一些Bean可以轉(zhuǎn)為靜態(tài)方法調(diào)用.方便使用.

          適用于一些系統(tǒng)只存在單例(singleton)并且 十分常用 的基礎(chǔ)服務(wù)對(duì)象.這些基礎(chǔ)服務(wù)如果每次使用spring注入,只會(huì)增加無(wú)謂的代碼及一些不確定性.

          示例如下:

          BeanValidatorHolder.validate(bean) // HibernateValidator一般系統(tǒng)只有一個(gè)
          CacheHolder.get("key") //如Memcached,應(yīng)用系統(tǒng)也只有一個(gè)對(duì)象
          ApplicationContextHolder.getBean("userInfoService");

          與singleton相比特點(diǎn)

          • 一個(gè)Holder只能持有一個(gè)對(duì)象
          • Holder一般是持有接口,所以你可以方便的改變實(shí)現(xiàn)
          • 配合spring完成Holder初始化

          示例1.CacheHolder?

          用于持有Cache對(duì)象

          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實(shí)現(xiàn)

          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靜態(tài)方法    
          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消息中心的消息發(fā)送
          MessageSourceHolder 持用MessageSource?,用于國(guó)際化
          MailerHolder 用于郵件發(fā)送的Mailer
          ConfigHolder 用于持有配置,需要?jiǎng)討B(tài)刷新的參數(shù)使用,請(qǐng)查看文章保持類的無(wú)狀態(tài)
          SecurityManagerHolder 用于權(quán)限控制的SecurityManager

          posted on 2010-06-22 22:01 badqiu 閱讀(2875) 評(píng)論(3)  編輯  收藏

          評(píng)論

          # re: Holder模式  回復(fù)  更多評(píng)論   

          ^_^holder隨好用,但是不利于動(dòng)態(tài)插拔,在OSGi的環(huán)境中,static也存在著陷阱。
          2010-06-23 10:31 | 臨遠(yuǎn)

          # re: Holder模式  回復(fù)  更多評(píng)論   

          一直反OSGI,因?yàn)镺SGI在做容器方面會(huì)比較好,但對(duì)于WEB應(yīng)用并不適用,因?yàn)镺SGI與應(yīng)用無(wú)狀態(tài)相違背。 只要做到應(yīng)用無(wú)狀態(tài),要做模塊化劃分是很容易的一件事。

          不需要OSGI搞得這么復(fù)雜.
          2010-06-23 10:41 | badqiu

          # re: Holder模式  回復(fù)  更多評(píng)論   

          OSGi引入了非常大的難度和風(fēng)險(xiǎn),帶來(lái)的好處也很明顯。仁者見(jiàn)仁,智者見(jiàn)智了。如果用ThreadLocal而不是static作為Holder的媒介,就可以避免OSGi這類多classloader環(huán)境帶來(lái)的隱形問(wèn)題。
          2010-06-23 11:09 | 臨遠(yuǎn)

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 九龙县| 彩票| 南溪县| 弥渡县| 邹平县| 陈巴尔虎旗| 阿巴嘎旗| 灵宝市| 靖边县| 邢台县| 万载县| 增城市| 丁青县| 宣武区| 洛浦县| 延边| 深水埗区| 盐池县| 澜沧| 巴楚县| 黑水县| 商水县| 阿尔山市| 苏尼特左旗| 涿鹿县| 云浮市| 右玉县| 镇巴县| 沂水县| 色达县| 集安市| 汨罗市| 翁牛特旗| 灌阳县| 敖汉旗| 安庆市| 石林| 福清市| 台前县| 南溪县| 天水市|