Hibernate學習_002_web開發中一些剪不斷、理還亂的關係總結(持續更新)

        掐指一算,從大二開始學習java,到用MVC servlet開發學校簡單的web,再到用SSH開發一些web項目,學到了不少技術,但是也許是很長一段時間,都是通過學習視頻,馬上將所學用在項目中,也有不少項目中框架是前人搭建好了,我僅僅是完成一些簡單業務邏輯,所有很多細節,以前並沒有在意。最近反思,發現很多東西以前都是模糊的,現在在學習新知識的同時,開始慢慢的總結。希望自己早日將自己所學的零零散散的知識形成一個完整的體系。

        其實我們不管是在用MVC開發時,還是用SSH,常常會不自覺的用到了一種模式,這種模式就是Facade模式,也就是我們常常說到的門面模式。

那麼究竟什麼是門面模式呢?其實,這裏舉一個簡單的例子,大家就能很清晰的知道什麼是門面模式了,想想看,我們在用MVC模式進行web開發的時候,我們總是會構建三層 。Model層,我覺得可以理解爲我們所說的Java Bean把,Visual層,可以理解爲視圖層,還有一個Control層,這個可以理解爲Servlet,一般我們會在Servlet中調用dao來操作數據庫。現在我們設想一種情景,假設現在我們有一個操作,要調用Dao中的兩個方法,這個時候我們一般是不會在servlet中通過dao來調用兩次dao中的方法的,對吧,那一般會怎麼實現呢?其實一般的實現可能是這樣一種情景,在Dao中定義了一個方法methodA(),通過這個方法再去調用我們原本要調用的那兩個方法。這樣我們在servlet中只需要去調用methodA()即可。從而將實際調用的兩個方法對外部隱藏。這個時候,這個methodA()其實就是充當那原本要調用的兩個方法的門面。這就是門面模式。說到這裏,是不是感覺有點和有那麼點AOP的感覺,其實我也覺得,其實,我覺得AOP中,那個接口就相當於是後面具體實現類的門面。

         縱觀J2SE,J2EE,有哪些技術中隱藏了這種模式的影子呢?下面是我的一點小小的總結。

1:JDBC

        在這裏,JDBC其實相當於一套使用JAVA操作數據庫的標準,應用程序面向JDBC接口編程,這個時候,我們程序後臺依據實際情況可以使MySQL,也可以是Oracle。我們只需要面向JDBC這一套標準來編寫業務邏輯,具體操作由後端數據庫決定。

2:JPA

        JPA,這是由SUN繼Hibernate後在J2EE 5.0中提出來的一套JAVA持久化對象的業界標準,準確的說,JPA本身並不可以完成數據庫的持久化,僅僅是一套接口標準而已,這個時候,後端具體實現,我們可以使用Hibernate,TopLink ,Ibatis,OpenJPA等等均可以。換句話說,當我們的應用程序是面向我們的JPA接口編程,後端的數據源可以實現方便的切換,如果分層良好,我們程序遷移的時候,僅僅需要修改的是我們的Dao層,保證了程序良好的移植性。在者,就是JPA與傳統ORM框架使用xml文件來配置實體類和關係數據庫的映射關係不同,它使用的是Annotation的方式。因爲JPA底層採用的還是關係數據庫,所以,它同時具備事務性,數據完整性,併發性等特性。目前,Hibernate,topLink等主流框架都提供了JPA的實現。


     (其實,在學習hibernate的時候,我一直被一個問題困擾着,EJB,JPA這兩者到底什麼關係?爲什麼我們使用hibernate的時候,還會導入一個ejb相關的包?其實,在EJB2.x中,總共有三大類型的bean,會話bean<Session Bean >、實體Bean<Entity Bean >、消息驅動Bean<Message Driven Bean>,在EJB升級到EJB3.X的時候,其中的實體Bean就被JPA所取代,所以說,JPA是源自於EJB3.X的。JPA不僅僅在J2EE中使用廣泛,在J2EE中同樣也很廣泛。)

3:SLF4J

       Simple Logging Facade for Java,單單從名字就可以看出,這個一定是使用的門面設計模式實現的框架,,slf4j本身也是一套日誌標準,在這套標準之後也有各種各樣的實現方式,比如有slf4j自己本身的實現方式(slf4f-nop.jar),也有log4j的實現,同時也可有apache的commons-logging.jar的實現,還可以有java自身的實現。其中Hibernate內部就是使用的slf4j自己的實現,而我們在工程開發中主要是使用的log4j實現。在針對不同的具體日誌實現的時候,大家是否想過一個問題,現在假設我們有了slf4j的接口,也有了log4j的實現,那麼,如果將接口和實現類關聯起來呢?這個其實在slf4j中已經爲我們考慮到了,觀察slf4j中提供的lib目錄下的jar文件,我們發現,它已經爲我們提供了相互關聯的中間JAR文件,這樣我們就可以通過這些文件將接口和具體實現關聯起來,這也就是大家所熟知的適配器設計模式(adaptor)


4:JTA

其實java本身有一套自己的Transaction API,但在J2EE中,SUN又提出了一套事物API,這就是JTA這個標準,簡單理解,JTA最大區別於JAVA本身事物API地方在於JTA是基於WEB container的。所以,一般在web中涉及到事物時,一般都會選擇JTA,JTA本身還支持跨數據庫的事物,但是一定要注意,這與外部使用的是什麼服務器有關,並不是所有容器面向JTA編程都可以支持跨越數據庫的事物的。

       以上總結會不斷的更新,希望大家多多交流,如果不對,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章