<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java-Android-jwebee
    Java-Android-jwebee
    對(duì)IT人來(lái)說(shuō),要成為一個(gè)優(yōu)秀的技術(shù)型管理者,除了需要具備扎實(shí)的技術(shù)基礎(chǔ)之外,還應(yīng)該培養(yǎng)良好的人際關(guān)系能力、談判與溝通技能、客戶關(guān)系與咨詢技能、商業(yè)頭腦和財(cái)務(wù)技能以及創(chuàng)新意識(shí),此外還要有巧妙的激勵(lì)技巧和化解沖突與解決突發(fā)問(wèn)題的能力.

    作者 Costin Leau譯者 胡鍵 發(fā)布于 2008年2月12日 下午11時(shí)13分

    社區(qū)
    Java
    主題
    門戶/內(nèi)容管理系統(tǒng)

    保存各種信息對(duì)于應(yīng)用程序來(lái)說(shuō)非常平常,大多數(shù)時(shí)候它們是保存在關(guān)系數(shù)據(jù)庫(kù)中。數(shù)據(jù)庫(kù)處理規(guī)范數(shù)據(jù)類型十分在行,但是在處理如圖像、文檔等二進(jìn)制數(shù)據(jù)時(shí)卻不是那么得心應(yīng)手。盡管可以用文件系統(tǒng)作為替代——而且它們還提供了更好的性能。但它們既沒(méi)有提供用于搜索信息的查詢語(yǔ)言,也沒(méi)有提供表示關(guān)系或事務(wù)的概念。

    在很多情況下,允許第三方訪問(wèn)這些存儲(chǔ)數(shù)據(jù)(隨著應(yīng)用程序的不斷擴(kuò)展,這成為一個(gè)典型的需求)是一個(gè)漫長(zhǎng)而復(fù)雜的過(guò)程(它們不會(huì)在一夜之間完成)。內(nèi)部存儲(chǔ)結(jié)構(gòu)很容易影響API架構(gòu),以及信息檢索與遍歷的方式。

    什么是JSR-170

    幸運(yùn)的是,被稱為Java內(nèi)容倉(cāng)庫(kù)(Java Content Repository,JCR)的JSR-170,試圖以獨(dú)立于具體實(shí)現(xiàn)的方式解決這些(以及其它)問(wèn)題。即,不論底層資源(如,數(shù)據(jù)庫(kù),本地或虛擬文件系統(tǒng))是什么,API都將相同。在數(shù)據(jù)存儲(chǔ)之上,JCR提供諸如訪問(wèn)粒度控制、版本控制、內(nèi)容事件、全文檢索和過(guò)濾等內(nèi)容服務(wù)。由Day Software領(lǐng)導(dǎo)的JSR-170背后的專家組令人印象深刻,包括內(nèi)容管理系統(tǒng)(CMS)提供商Vignette、Hummingbird Ltd.、Stellent和通用Java驅(qū)動(dòng)解決方案提供商,如BEA Systems、IBM和Oracle。該規(guī)范很可能成為內(nèi)容管理和文檔存儲(chǔ)方面事實(shí)上的標(biāo)準(zhǔn)。

    經(jīng)過(guò)幾乎2年半的努力,工作最終于2005年6月完成,在javax.jcr包中,API包含了大約50個(gè)類(主要是接口和異常)。2006年早些時(shí)候,發(fā)布了初始1.0版本的參考實(shí)現(xiàn)(JackRabbit)。

    JSR-170概覽

    Java內(nèi)容倉(cāng)庫(kù)建立在倉(cāng)庫(kù)(除了是“用于安全地保存貨物的地點(diǎn)”的通常含義之外)概念之上,它提供了幾個(gè)操作數(shù)據(jù)的特性。倉(cāng)庫(kù)使用“樹(shù)結(jié)構(gòu)”保存信息,如下圖,樹(shù)由節(jié)點(diǎn)和屬性組成。圓圈代表節(jié)點(diǎn),方框代表屬性。1個(gè)節(jié)點(diǎn)有且只有1個(gè)父親,有任意數(shù)目的孩子(子節(jié)點(diǎn))和任意數(shù)目的屬性。1個(gè)屬性有且只有一個(gè)父親(它是節(jié)點(diǎn)),它沒(méi)有子節(jié)點(diǎn),由一個(gè)名字和一個(gè)或多個(gè)值組成。屬性值的類型可以是:布爾(Boolean)、日期(Date)、雙精(Double),長(zhǎng)整(Long),字符串(String)或流(Stream)。只有屬性可以被用來(lái)存儲(chǔ)信息,節(jié)點(diǎn)則被用來(lái)創(chuàng)建樹(shù)內(nèi)部的“路徑”。在某種程度上,這棵樹(shù)類似文件系統(tǒng)的結(jié)構(gòu),節(jié)點(diǎn)是目錄,屬性是實(shí)際的文件。

    倉(cāng)庫(kù)的功能被劃分為幾個(gè)“兼容性”級(jí)別,每個(gè)級(jí)別提供一組特定的特性:

    1. 級(jí)別 1

      對(duì)于所有實(shí)現(xiàn),級(jí)別1是必須的,它提供對(duì)倉(cāng)庫(kù)的訪問(wèn),簡(jiǎn)而言之:
      • 對(duì)節(jié)點(diǎn)和屬性的讀訪問(wèn)。
      • 對(duì)屬性值的讀訪問(wèn)。
      • 輸出到XML/SAX。
      • 支持XPATH語(yǔ)法的查詢服務(wù)。
    2. 級(jí)別 2

      級(jí)別2提供功能:
      • 增加和移除節(jié)點(diǎn)和屬性。
      • 對(duì)屬性值的寫操作。
      • 從XML/SAX輸入數(shù)據(jù)。

      值得注意的是,JCR的實(shí)現(xiàn)并不要求達(dá)到級(jí)別2或者更高層次。因此與只讀倉(cāng)庫(kù)一起工作也是完全符合規(guī)范的。

    3. 可選級(jí)別

      “可選”級(jí)別包含一些高級(jí)特性,它并不是讀寫倉(cāng)庫(kù)所必需的,但確是真正為JSR-170增色的部分。這個(gè)級(jí)別包括(除了其它之外):
      • 事務(wù) —— 它使倉(cāng)庫(kù)有可能與JMS或JDBC資源一起工作。
      • 版本標(biāo)定 —— 允許倉(cāng)庫(kù)記錄節(jié)點(diǎn)的不同狀態(tài),以備日后檢索。規(guī)范對(duì)于這個(gè)主題有相當(dāng)?shù)钠辉撎匦允沟糜肑SR-170作為后端構(gòu)建一個(gè)CVS的克隆成為可能。
      • 事件 —— 亦稱觀察,它允許倉(cāng)庫(kù)內(nèi)發(fā)生的任何活動(dòng)都會(huì)被通知給客戶端。
      •  —— 可以凍結(jié)部分樹(shù)的功能,它可以有效地返回一個(gè)只讀的子樹(shù)。

    API回顧

    使用JSR-170時(shí),建議使用來(lái)自javax.jcr包的接口。這樣,更換JCR實(shí)現(xiàn)時(shí)會(huì)容易些,不會(huì)有任何代碼的變動(dòng)。

    API的核心類是Session,它代表客戶端和倉(cāng)庫(kù)之間的連接,使用連接活躍其上的workspace名和所提供的credentials進(jìn)行定義。Session包含讀(級(jí)別1)和寫(級(jí)別2)方法;使用底層倉(cāng)庫(kù)不支持的功能時(shí)將拋出異常。

    這個(gè)包還包含了那些組成倉(cāng)庫(kù)的單元接口的定義:WorkspaceCredentialsNodePropertyItemNodeProperty的超類)和Valuejavax.jcr.query包負(fù)責(zé)處理查詢,javax.jcr.nodetype包負(fù)責(zé)定義節(jié)點(diǎn)類型。剩余的包負(fù)責(zé)可選級(jí)別的功能,如javax.jcr.versionjavax.jcr.observationjavax.jcr.lock。一個(gè)有趣的包是javax.jcr.util,它包含一個(gè)ItemVisitor的實(shí)現(xiàn),它源自GOF(四人幫,Gang of Four)撰寫的著名的設(shè)計(jì)模式中的訪問(wèn)者模式(Visitor-pattern)接口。

    JSR-170實(shí)現(xiàn)

    GoogleSourceForge會(huì)列出好幾頁(yè)的JSR-170實(shí)現(xiàn),但是它們中的大多數(shù)都處于alpha階段,沒(méi)有發(fā)布任何版本。以下是一個(gè)可以自由下載的項(xiàng)目列表,它們已經(jīng)被作者使用過(guò):

    • Jackrabbit
      它是JSR-170的參考實(shí)現(xiàn),Apache基金的一部分,提供級(jí)別1,2和可選功能。在撰寫本文時(shí),它已經(jīng)經(jīng)過(guò)孵化階段并有一個(gè)官方公開(kāi)的發(fā)布版本,該版本被認(rèn)為足夠穩(wěn)定,可以被用在產(chǎn)品環(huán)境。此外,Jackrabbit也被用來(lái)作為Day Software(JSR-170的領(lǐng)導(dǎo)者)的商業(yè)產(chǎn)品的基礎(chǔ)。除了實(shí)現(xiàn)JSR-170中定義的所有特性,JackRabbit還加入了額外的功能(如SessionListenersCustomNode注冊(cè)),以及一個(gè)有趣的捐獻(xiàn)來(lái)的項(xiàng)目套件,它包括:JCA連接器、taglib、WebDAV接口、虛擬文件系統(tǒng)和JDBC后端。JackRabbit的許可證是Apache 2.0。
    • eXo JCR
      它是eXo platoform的一部分,包含規(guī)范要求的所有強(qiáng)制特性和幾個(gè)可選特性。最近一次的版本發(fā)布(1.0RC7)是2006年6月22日,基于規(guī)范的最終草案2。eXo JCR支持JDBC兼容數(shù)據(jù)庫(kù),如MySQL、DB2或HSQL(它是缺省的)作為后端存儲(chǔ),它是雙許可的(GPL和商用),最終版的發(fā)布日期尚未確定。
    • Jeceira
      與Jackrabbit和eXo JCR相比,它是相對(duì)較新的項(xiàng)目。它實(shí)現(xiàn)了級(jí)別1和2的一些需求,只在寫操作時(shí),支持來(lái)自可選級(jí)別的觀察功能。不幸的是,這個(gè)項(xiàng)目處于未完成階段,在過(guò)去的9個(gè)月沒(méi)有新版本發(fā)布。然而它被Magnolia(一個(gè)流行的基于java的CMS,與作為JSR-170參考實(shí)現(xiàn)的Jackrabbit類似)使用。在最終版發(fā)布時(shí),它計(jì)劃包含所有級(jí)別的功能,發(fā)布時(shí)間目前尚不確定。Jeceira的許可證是Apache 2.0,使用HSQL數(shù)據(jù)庫(kù)作為它的存儲(chǔ)引擎。

    JCR模塊

    Spring Modules的一部分,JCR模塊的主要目標(biāo)是:以一種類似Spring主分發(fā)包中ORM包的方式,簡(jiǎn)化使用JSR-170 API進(jìn)行開(kāi)發(fā)。特點(diǎn)如下:

    • JcrTemplate,允許執(zhí)行JcrCallback和異常處理(將需檢查的JCR異常轉(zhuǎn)換成不需檢查的Spring DAO異常)。這個(gè)模板實(shí)現(xiàn)了來(lái)自JCR Session的絕大部分方法,可以簡(jiǎn)單地作為替換物使用。此外該模板知道線程綁定的會(huì)話,這個(gè)會(huì)話可以跨幾個(gè)方法使用,這在使用事務(wù)型倉(cāng)庫(kù)時(shí)非常有用。
    • RepositoryFactoryBean,它配置、啟動(dòng)和停止倉(cāng)庫(kù)實(shí)例。因?yàn)镴SR-170并沒(méi)有說(shuō)明倉(cāng)庫(kù)配置的標(biāo)準(zhǔn)方式,需要注意實(shí)現(xiàn)在這個(gè)方面的不同。這個(gè)支持包含預(yù)定義的用于Jackrabbit和Jeceira的FactoryBean,以及一個(gè)可以很容易支持其它倉(cāng)庫(kù)的抽象基類。
    • SessionFactory,用來(lái)統(tǒng)一RepositoryCredentialsWorkspace接口,允許自動(dòng)注冊(cè)監(jiān)聽(tīng)器和自定義名字空間。
    • Spring聲明性事務(wù)為那些實(shí)現(xiàn)了(可選)事務(wù)特性的倉(cāng)庫(kù)提供了支持。
    • OpenSessionInView攔截器和過(guò)濾器允許每個(gè)線程跨不同組件使用同一會(huì)話。與JcrTemplate一起,檢索、關(guān)閉和管理JCR會(huì)話的工作已經(jīng)外部化,對(duì)于調(diào)用者完全透明。

    本文將使用參考實(shí)現(xiàn)(Jackrabbit),由于JCR模塊使用的是javax.jcr接口,因此改變實(shí)現(xiàn)根本就是一個(gè)配置的問(wèn)題。讓我們一步一步地來(lái)看看在Jackrabbit之上如何使用Java內(nèi)容倉(cāng)庫(kù),以及如何讓Spring模塊來(lái)幫助完成這一工作。

    配置倉(cāng)庫(kù)和SessionFactory

    <bean id="repository" class="org.springmodules.jcr.jackrabbit.RepositoryFactoryBean">
    <!-- normal factory beans params -->
    <property name="configuration" value="classpath:jackrabbit-repo.xml"/>
    <property name="homeDir" ref="./tmp/repo"/>
    </bean>

    JCR支持提供RepositoryFactoryBean類配置Jackrabbit,它需要JackRabbit的配置文件和主目錄。注意,RepositoryFactoryBean在使用本地文件系統(tǒng)時(shí)特別有用;對(duì)于服務(wù)器環(huán)境,倉(cāng)庫(kù)可能被注冊(cè)在JNDI中,此時(shí)可以使用JndiObjectFactoryBean幫助類(Spring分發(fā)包的一部分)檢索它:

    <bean id="repository" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jcr/myRepository"/>
    </bean>

    或使用Spring 2.0的模式名字空間:

    <jndi:lookup id="entityManagerFactory" jndi-name="jcr/myRepository"/>

    為了簡(jiǎn)化與JCR的工作,模塊增加了SessionFactory接口:

    public interface SessionFactory {
    public Session getSession() throws RepositoryException;
    public SessionHolder getSessionHolder(Session session);
    }

    SessionFactory隱藏了實(shí)現(xiàn)內(nèi)部的認(rèn)證細(xì)節(jié),因此一旦配置完成,使用同一證書的會(huì)話可以很容易的被檢索出來(lái)。為了利用實(shí)現(xiàn)的特性(沒(méi)有涵蓋在規(guī)范中的),這個(gè)接口允許檢索SessionHolder。它是一個(gè)JCR模塊特定類,主要被用于事務(wù)和會(huì)話管理(通過(guò)一種可用于每個(gè)JCR實(shí)現(xiàn)的缺省、通用實(shí)現(xiàn)),但是它不支持可選特性或自定義特性(如JackrabbitSessionHolder,它支持Jackrabbit的事務(wù)基礎(chǔ)結(jié)構(gòu))。JCR模塊提供一種簡(jiǎn)易、透明的方式來(lái)發(fā)現(xiàn)SessionHolder實(shí)現(xiàn)(這些我將在以后詳細(xì)提到),使之很容易地插入對(duì)JSR-170其它兼容庫(kù)的支持。

    SessionFactory的缺省實(shí)現(xiàn)是JcrSessionFactory,它要求一個(gè)進(jìn)行工作的倉(cāng)庫(kù)和證書。

    <!-— SessionFactory -->
    <bean id="jcrSessionFactory" class="org.springmodules.jcr.JcrSessionFactory">
    <property name="repository" ref="repository"/>
    <property name="credentials">
    <bean class="javax.jcr.SimpleCredentials">
    <constructor-arg index="0" value="bogus"/>
    <!-- create the credentials using a bean factory -->
    <constructor-arg index="1">
    <bean factory-bean="password" factory-method="toCharArray"/>
    </constructor-arg>
    </bean>
    </property>
    </bean>

    <!-- create the password to return it as a char[] -->
    <bean id="password" class="java.lang.String">
    <constructor-arg index="0" value="pass"/>
    </bean>

    這個(gè)bean聲明非常簡(jiǎn)單,唯一需要注意的地方是,密碼被提供給SimpleCredential的構(gòu)造函數(shù):它只接受字符數(shù)組,使用Spring工廠聲明作為一種變通。

    JcrTemplate

    JcrTemplate是JCR模塊的核心類之一,它提供了與JCR會(huì)話一起工作的方便方法,將調(diào)用者從必須處理的打開(kāi)和關(guān)閉會(huì)話、事務(wù)回滾(如果底層倉(cāng)庫(kù)提供)、以及處理其它特性中的異常等工作中解放出來(lái):

    <bean id="jcrTemplate" class="org.springmodules.jcr.JcrTemplate">
        <property name="sessionFactory" ref="jcrSessionFactory"/>
        <property name="allowCreate" value="true"/>
    </bean>

    模板定義非常簡(jiǎn)單,類似來(lái)自Spring框架的其它模板類,如HibernateTemplate

    例子

    既然倉(cāng)庫(kù)已經(jīng)配置了,接下來(lái)看看“Spring化”的例子之一,它來(lái)自Jackrabbit的wiki頁(yè):

    public Node importFile(final Node folderNode, final File file, final String mimeType, 
    final String encoding) {

    return (Node) execute(new JcrCallback() {
               
    /**
    * @see org.springmodules.jcr.JcrCallback#doInJcr(javax.jcr.Session)
    */
    public Object doInJcr(Session session) throws
    RepositoryException, IOException {
      
           
    JcrConstants jcrConstants = new JcrConstants(session);
           
    //create the file node - see section 6.7.22.6 of the spec
    Node fileNode = folderNode.addNode(file.getName(),
    jcrConstants.getNT_FILE());
     
    //create the mandatory child node - jcr:content
    Node resNode = fileNode.addNode(jcrConstants.getJCR_CONTENT(),
    jcrConstants.getNT_RESOURCE());
       
         resNode.setProperty(jcrConstants.getJCR_MIMETYPE(), mimeType);
        resNode.setProperty(jcrConstants.getJCR_ENCODING(), encoding);
    resNode.setProperty(jcrConstants.getJCR_DATA(), new FileInputStream(file));
    Calendar lastModified = Calendar.getInstance();
    lastModified.setTimeInMillis (file.lastModified ());
    resNode.setProperty(jcrConstants.getJCR_LASTMODIFIED(), lastModified);
                 
    session.save();
                 
    return resNode;
    }
    });
    }

    主要區(qū)別是:代碼被包裝在一個(gè)JCR模板中,它將我們從不得不使用的try/catch語(yǔ)句塊(因?yàn)?strong>IO和Repository的需檢查異常)和處理會(huì)話(和事務(wù),如果有的話)清除工作中解放出來(lái)。值得提及的是硬編碼字符串,如“jcr:data”,是通過(guò)JcrConstants工具類解析出來(lái)的。它知道名字空間的前綴變化,并提供一種干凈的方式處理JCR常數(shù)。正如你看到的,我只是使例子更加健壯,但是對(duì)于實(shí)際業(yè)務(wù)代碼影響最小。

    事務(wù)支持

    使用JCR模塊的一個(gè)好處就是能將Spring事務(wù)基礎(chǔ)設(shè)施(包括聲明性和編程性)應(yīng)用于Java內(nèi)容倉(cāng)庫(kù)。JSR 170將事務(wù)支持視為可選特性,并沒(méi)有強(qiáng)制一個(gè)標(biāo)準(zhǔn)的方式來(lái)暴露事務(wù)鉤子,因此每個(gè)實(shí)現(xiàn)可以選擇不同的方法。在本文撰寫時(shí),只有Jackrabbit支持事務(wù)(在它的大部分操作中),它通過(guò)為每個(gè)JcrSession暴露一個(gè)javax.transaction.XAResource做到這一點(diǎn)。JCR模塊提供LocalTransactionManager用于本地事務(wù):

    <bean id="jcrTransactionManager" class="org.springmodules.jcr.jackrabbit.LocalTransactionManager">
    <property name="sessionFactory" ref="jcrSessionFactory"/>
    </bean>

    為了聲明事務(wù)劃分,我與上述事務(wù)管理器bean聲明一起使用標(biāo)準(zhǔn)Spring類:

    <!-- transaction proxy for Jcr services/facades -->
    <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="proxyTargetClass">
            <value>true</value>
         </property>

         <property name="transactionManager" ref="jcrTransactionManager"/>
         <property name="transactionAttributes">
         <props>
            <prop key="save*">PROPAGATION_REQUIRED</prop>
           <prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
         </props>
         </property>
    </bean>
    <bean id="jcrService" parent="txProxyTemplate">
        <property name="target">
            <bean class="org.springmodules.examples.jcr.JcrService">
                <property name="template" ref="jcrTemplate"/>
            </bean>
        </property>
    </bean>

    如果要求一個(gè)JTA管理器,一個(gè)簡(jiǎn)單而優(yōu)雅的解決辦法是使用來(lái)自Jackrabbit捐獻(xiàn)包的jca連接器。為了使用jca,你并不需要一個(gè)應(yīng)用服務(wù)器,因?yàn)槟憧梢杂靡粋€(gè)可插入的JCA容器,如Jencks。JCA容器的配置已經(jīng)超出本文的范圍,但是你可以參考JCR模塊例子中使用Jencks的例子。

    TransactionAwareRepository

    對(duì)于要求普通JCR代碼的應(yīng)用程序,JCR模塊允許用直接使用JCR API的代碼,透明地使用事務(wù)驅(qū)動(dòng)會(huì)話。 此時(shí),可以使用TransactionAwareRepository,它有一個(gè)參數(shù)是JcrSessionFactory。這樣,在使用Session.login()(它接收定義在JcrSessionFactory中的參數(shù))創(chuàng)建任何新會(huì)話時(shí),如果發(fā)現(xiàn)有線程綁定的會(huì)話,就將返回它。注意:如果使用事務(wù),JCR會(huì)話就是事務(wù)性的,否則你必須手動(dòng)設(shè)置屬性allowNonTxRepository為true,配置如下,要不然將拋出一個(gè)異常:

    <bean id="transactionRepository" class="org.springmodules.jcr.TransactionAwareRepository">
         <property name="allowNonTxRepository" value="true"/>
         <property name="targetFactory" ref="jcrSessionFactory"/>
    </bean>

    transactionRepository bean可以被用作一個(gè)普通的JCR倉(cāng)庫(kù),不關(guān)心底層機(jī)制或線程綁定會(huì)話、事務(wù)性或非事務(wù)性(如果有事務(wù),關(guān)閉會(huì)話時(shí)要提交事務(wù))。

    可選特性支持偵測(cè)

    為了最大化代碼重用,但仍然允許插入可選特性,如用于不同JCR實(shí)現(xiàn)的事務(wù)支持,JCR模塊使用SessionHolder接口(前面已經(jīng)提到),同時(shí)還有SessionHolderProviderSessionHolderProviderManager接口。用戶一般不用與它們打交道,因?yàn)樗鼈兪强蚣軆?nèi)部使用的;但是,它們代表了JCR模塊主要的擴(kuò)展點(diǎn)。

    SessionHolder類被內(nèi)部不同組件使用,主要被事務(wù)管理器用來(lái)操作會(huì)話,SessionHolderProviderSessionHolderProviderManager處理sessionHolder創(chuàng)建的方式以及提供者是如何被個(gè)別使用的。缺省將使用ServiceSessionHolderProviderManager,它利用JDK 1.3 Service Provider的自動(dòng)發(fā)現(xiàn)特性。管理器將在類路徑中搜索META-INF/services/org.springmodules.jcr.SessionHolderProvider條目,它包含了SessionHolderProvider實(shí)現(xiàn)的完整限定名。Jackrabbit支持就是這樣配置的,JCR模塊的分發(fā)包中包含一個(gè)META-INF/services/org.springmodules.jcr.SessionHolderProvider(譯注:原文有誤,沒(méi)有給出后面的文件名)文件,它只有一行:

    org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider

    缺省,SessionHolderProviderManagerJcrSessionFactory內(nèi)部使用,因此在工廠啟動(dòng)時(shí),任何客戶化實(shí)現(xiàn)可以被獲取,并與合適的倉(cāng)庫(kù)一起使用。但是,通過(guò)設(shè)置JcrSessionFactory中的SessionHolderProviderManager,可以很容易的切換到一個(gè)不同的發(fā)現(xiàn)策略。一個(gè)可替代的發(fā)現(xiàn)服務(wù)是ListSessionHolderProviderManager,它接收一組提供者列表,可以方便地使用自定義提供(如測(cè)試)。

    <bean id="listProviderManager" class="org.springmodules.jcr.support.ListSessionHolderProviderManager">
         <property name="providers">
             <list>
                <bean class="org.mycompany.jcr.CustomHolderProvider"/>
                <bean class="org.springmodules.jcr.jackrabbit.support.JackRabbitSessionHolderProvider"/>
                <bean class="org.springmodules.jcr.support.GenericHolderProvider"/>
             </list>
         </property
    </bean>

    <bean id="jcrSessionFactory" class="org.springmodules.jcr.JcrSessionFactory">
            ...
        <property name="sessionHolderProviderManager" ref="listProviderManager"/>
    </bean>

    注意,每個(gè)倉(cāng)庫(kù)一個(gè)提供者。如果列表包含多個(gè)工作于同一倉(cāng)庫(kù)的提供者,順序?qū)⒎浅V匾驗(yàn)橄绕ヅ涞南仁褂谩?/p>

    Java內(nèi)容倉(cāng)庫(kù)的未來(lái)

    盡管JSR-170已經(jīng)于2005年5月完成,Java內(nèi)容倉(cāng)庫(kù)的工作并沒(méi)有終止。JSR-283,官方的后繼者,將聚焦于功能增強(qiáng),如聯(lián)邦,remoting,客戶端/服務(wù)器協(xié)議映射和擴(kuò)展內(nèi)容模型的能力。同時(shí)還存在著一些JSR之外的想法和項(xiàng)目:綁定/映射框架,它可以將java類轉(zhuǎn)換為一個(gè)JCR樹(shù),反之亦然(類似ORM,后端用Java內(nèi)容倉(cāng)庫(kù)替代數(shù)據(jù)庫(kù)),建構(gòu)于JCR之上的WebDAV服務(wù)器(參見(jiàn)Jackrabbit的捐獻(xiàn)包),以及其他。已經(jīng)出現(xiàn)了用于不同產(chǎn)品的JSR-170連接器,如Alfresco、BEA Portal Server和IBM Domino。

    至于JCR模塊,路線圖包括用于幾個(gè)實(shí)現(xiàn)的Acegi安全集成,支持Spring 2.0名字空間模式(它將減少XML的配置)和與其它JCR實(shí)現(xiàn)集成。很顯然,JCR的看起來(lái)一片光明。

    查看英文原文:Integrating Java Content Repository and Spring

    加入書簽
    digg+,
    reddit+,
    del.icio.us+,
    dzone+
    標(biāo)簽
    Java內(nèi)容倉(cāng)庫(kù),
    Spring


    jwebee

    我的個(gè)人網(wǎng)站
    posted on 2008-02-19 18:12 周行 閱讀(810) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    Java-Android-jwebee
    主站蜘蛛池模板: 亚洲综合av永久无码精品一区二区| 久久大香伊焦在人线免费| 亚洲欧美成人av在线观看| 亚洲Av无码一区二区二三区| 2022年亚洲午夜一区二区福利 | 成年网站免费视频A在线双飞| 国产亚洲综合视频| 日韩亚洲AV无码一区二区不卡| 狠狠色伊人亚洲综合网站色| 亚洲人成色7777在线观看| 岛国片在线免费观看| 国产一精品一aⅴ一免费| 亚洲看片无码在线视频| 成人午夜影视全部免费看| 国产福利免费观看| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲av中文无码字幕色不卡| 妻子5免费完整高清电视| 亚洲人成中文字幕在线观看| 高清国语自产拍免费视频国产| 日韩视频免费在线观看| 亚洲影院在线观看| 亚洲中文字幕在线第六区| 国产精品亚洲不卡一区二区三区| 亚洲视频在线免费播放| igao激情在线视频免费| 99re6免费视频| 久久精品国产亚洲AV忘忧草18| 久久亚洲AV成人无码国产| 99re6免费视频| 亚洲日本VA中文字幕久久道具| 亚洲视频一区网站| 亚洲色大成网站WWW久久九九| 免费看国产一级片| 在线观看免费精品国产| 最近中文字幕mv免费高清电影| 中国在线观看免费国语版| free哆啪啪免费永久| 最近中文字幕完整版免费高清| 亚洲精品白浆高清久久久久久| 国产精品亚洲一区二区在线观看|