JAVA基礎(chǔ):JAVA中的JCR模塊

字號:

Spring Modules的一部分,JCR模塊的主要目標是:以一種類似Spring主分發(fā)包中ORM包的方式,簡化使用JSR-170 API進行開發(fā)。特點如下:
    JcrTemplate,允許執(zhí)行JcrCallback和異常處理(將需檢查的JCR異常轉(zhuǎn)換成不需檢查的Spring DAO異常)。這個模板實現(xiàn)了來自JCRSession的絕大部分方法,可以簡單地作為替換物使用。此外該模板知道線程綁定的會話,這個會話可以跨幾個方法使用,這在使用事務(wù)型倉庫時非常有用。
    RepositoryFactoryBean,它配置、啟動和停止倉庫實例。因為JSR-170并沒有說明倉庫配置的標準方式,需要注意實現(xiàn)在這個方面的不同。這個支持包含預(yù)定義的用于Jackrabbit和Jeceira的FactoryBean,以及一個可以很容易支持其它倉庫的抽象基類。
    SessionFactory,用來統(tǒng)一Repository,Credentials和Workspace接口,允許自動注冊監(jiān)聽器和自定義名字空間。
    Spring聲明性事務(wù)為那些實現(xiàn)了(可選)事務(wù)特性的倉庫提供了支持。
    OpenSessionInView攔截器和過濾器允許每個線程跨不同組件使用同一會話。與JcrTemplate一起,檢索、關(guān)閉和管理JCR會話的工作已經(jīng)外部化,對于調(diào)用者完全透明。
    本文將使用參考實現(xiàn)(Jackrabbit),由于JCR模塊使用的是javax.jcr接口,因此改變實現(xiàn)根本就是一個配置的問題。讓我們一步一步地來看看在Jackrabbit之上如何使用Java內(nèi)容倉庫,以及如何讓Spring模塊來幫助完成這一工作。
    配置倉庫和SessionFactory
    
    
    
    

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

    或使用Spring 2.0的模式名字空間:
    
    為了簡化與JCR的工作,模塊增加了SessionFactory接口:
    public interface SessionFactory {
    public Session getSession() throws RepositoryException;
    public SessionHolder getSessionHolder(Session session);
    }
    SessionFactory隱藏了實現(xiàn)內(nèi)部的認證細節(jié),因此一旦配置完成,使用同一證書的會話可以很容易的被檢索出來。為了利用實現(xiàn)的特性(沒有涵蓋在規(guī)范中的),這個接口允許檢索SessionHolder。它是一個JCR模塊特定類,主要被用于事務(wù)和會話管理(通過一種可用于每個JCR實現(xiàn)的缺省、通用實現(xiàn)),但是它不支持可選特性或自定義特性(如JackrabbitSessionHolder,它支持Jackrabbit的事務(wù)基礎(chǔ)結(jié)構(gòu))。JCR模塊提供一種簡易、透明的方式來發(fā)現(xiàn)SessionHolder實現(xiàn)(這些我將在以后詳細提到),使之很容易地插入對JSR-170其它兼容庫的支持。
    SessionFactory的缺省實現(xiàn)是JcrSessionFactory,它要求一個進行工作的倉庫和證書。
    
    
    
    
    
    
    
    
    

    

    

    

    
    
    

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