badqiu

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

          Holder模式

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

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

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

          示例如下:

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

          與singleton相比特點

          • 一個Holder只能持有一個對象
          • Holder一般是持有接口,所以你可以方便的改變實現(xiàn)
          • 配合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實現(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?,用于國際化
          MailerHolder 用于郵件發(fā)送的Mailer
          ConfigHolder 用于持有配置,需要動態(tài)刷新的參數(shù)使用,請查看文章保持類的無狀態(tài)
          SecurityManagerHolder 用于權(quán)限控制的SecurityManager

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

          評論

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

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

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

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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 津南区| 石狮市| 上虞市| 汕头市| 宁国市| 山东| 闸北区| 兴宁市| 天祝| 托克托县| 郸城县| 哈尔滨市| 涟水县| 兰州市| 南投县| 城口县| 正镶白旗| 永平县| 安乡县| 清流县| 肃北| 阿尔山市| 大渡口区| 鄄城县| 巴楚县| 保德县| 双桥区| 白朗县| 西青区| 多伦县| 白玉县| 开鲁县| 胶州市| 南充市| 吴忠市| 永寿县| 荔浦县| 平邑县| 蚌埠市| 丹东市| 阿鲁科尔沁旗|