badqiu

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

          Holder模式

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

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

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

          示例如下:

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

          與singleton相比特點(diǎn)

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

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

          評論

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

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

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

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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高青县| 柳林县| 永顺县| 西丰县| 阿拉善右旗| 岳阳市| 武宣县| 喜德县| 唐山市| 临朐县| 乌审旗| 大冶市| 西宁市| 孝感市| 青岛市| 临朐县| 新昌县| 芦溪县| 邵阳县| 永吉县| 正镶白旗| 济阳县| 泽普县| 桃园县| 武隆县| 咸丰县| 宁城县| 从化市| 鄄城县| 黎城县| 吴桥县| 阿坝县| 呼玛县| 江都市| 潜山县| 大名县| 秦皇岛市| 沁水县| 鹤岗市| 湖州市| 泰来县|