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 閱讀(2872) 評論(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 | 臨遠

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


          網站導航:
           
          主站蜘蛛池模板: 楚雄市| 南安市| 金阳县| 南涧| 叙永县| 达拉特旗| 田林县| 乡城县| 米脂县| 上林县| 内江市| 锦屏县| 旬邑县| 镇宁| 且末县| 道孚县| 朝阳县| 车致| 五华县| 阜阳市| 甘谷县| 获嘉县| 朝阳县| 长武县| 班玛县| 阿拉善右旗| 蒲城县| 牙克石市| 安福县| 田阳县| 祁连县| 孟连| 克拉玛依市| 尤溪县| 耒阳市| 衡阳市| 浦城县| 建德市| 奉贤区| 普洱| 苍山县|