歡迎使用我的 在線工具

          小D

          讀歷史、看小說、寫程序都是我所愛。技術(shù)不好,頭腦不靈光,靠的是興趣。
          隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
          數(shù)據(jù)加載中……

          Spring jpetstore 閱讀筆記

          1.org.springframework.beans.support.PagedListHolder
          PagedListHolder 是一個(gè)簡單狀態(tài)的,可以處理對象列表的持有者,它將這些對象分成頁面。頁號從0開

          始。
          這個(gè)主要在WEB UI中使用。具有代表的,一個(gè)實(shí)例將被以列示一列bean,將它們放置到session中,然后

          將它們導(dǎo)出為一個(gè)model(模型)。所有的屬性將程序化set/get,但是最常用的方式是數(shù)據(jù)綁定,例如組

          裝請求參數(shù)中的bean。View層中主要用到getter方法。
          使用一個(gè)屬性“sort”,將通過一個(gè)SortDifinition實(shí)現(xiàn)將基本的list排序。默認(rèn),一個(gè)

          MutableSortDefinition實(shí)例將被使用,使用相同的屬性將遞增給定的值。
          ?BeanWrapper要求,綁定數(shù)據(jù)名必須被稱作“pageSize”和 “sort.ascending”。 注意,名字

          和嵌套語法匹配各自的JSTL EL表達(dá)式,例如“myModelAttr.pageSize”和

          “myModelAttr.sort.ascending”。
          ?其實(shí),就是用來提供給表現(xiàn)分頁用的。

          2.? org.springframework.beans.factory.InitializingBean
          ??這是一個(gè)能夠被bean實(shí)現(xiàn)的接口,如果這個(gè)bean需要一旦它所有的屬性被注入(還有指定的

          BeanFactoryAware和ApplicationContextAware接口相關(guān)的方法都被執(zhí)行)后就做出反應(yīng):例如,執(zhí)行一

          個(gè)自定義的初始化,或者僅僅是檢查所有托管的屬性是否被正確的注入。可以通過拋出異常阻止繼續(xù)初

          始化。
          ?我們也可以選擇指定一個(gè)自定義的 init-method來代替實(shí)現(xiàn)InitializingBean,這個(gè)init-

          method通過一個(gè)描述bean定義的XML定義。
          ?
          3.?org.springframework.aop. AfterReturningAdvice
          After returning advice 僅僅在正常的方法返回后調(diào)用,而不是在拋出異常時(shí)調(diào)用。這個(gè)通知能夠看到

          返回值,但是不能改變它。
          它唯一的方法為:void afterReturning(Object returnValue, Method method, Object[] args,

          Object target) throws Throwable;
          ??在指定的方法(其實(shí)就是JoinPoint)成功返回后被調(diào)用。
          ??參數(shù) returnValue: 指定的方法的返回值。
          ??參數(shù) method:被調(diào)用的方法。
          ??參數(shù) args:方法的參數(shù)。
          ??參數(shù) target:方法期待的目標(biāo)。可以使null。JoinPoint所在的對象。
          ??@throws :如果當(dāng)前對象希望中斷調(diào)用,則拋出異常。所有方法簽名中允許拋出的異

          常將會返回給調(diào)用者。否則將會被包裝為運(yùn)行期異常。

          4.? org.springframework.mail.SimpleMailMessage
          設(shè)計(jì)一個(gè)簡單mail 信息,它包括收信人mail、發(fā)信人mail、主題和內(nèi)容。
          ?考慮JavaMailSender 和 JavaMailMimeMessage 來創(chuàng)建更復(fù)雜的信息,例如帶有附件的信息,

          特殊符號,或者私人郵件。
          5.? org.springframework.samples.jpetstore.domain.logic. PetStoreImpl
          ?這里是該程序的作者對其說明,很有意義。
          ?JPetStore主要業(yè)務(wù)對象。
          這個(gè)對象使用了5個(gè)DAO對象,從具體的操作持久化API工作中解脫出來。因此,雖然這個(gè)程序使用

          iBATIS 做數(shù)據(jù)訪問,但是如果要使用其它的持久化工具來訪問,就不需要修改這個(gè)類的任何代碼。
          這個(gè)對象使用DAO實(shí)例是通過Spring容器依賴注入的(使用依賴注入使DAO變成是可配置的)。我們這里使

          用的setter注入,暴露每個(gè)DAO的setter方法給用戶。這就意味著我們只要在配置該類的bean時(shí),使用“

          property”屬性就可以注入DAO。這里的屬性是只寫的(write-only):相應(yīng)的setter方法沒有對應(yīng)的

          getter方法。Getter方法是可選的:只有當(dāng)你的業(yè)務(wù)對象需要訪問這些屬性時(shí),才去暴露getter方法。
          ?在JPetStore程序中只有一個(gè)該類的對象。在Spring術(shù)語中,這叫做一個(gè)“singleton“(單例)

          對象。這就意味著每個(gè)程序上下文都只有一個(gè)。工廠創(chuàng)建一個(gè)單例對象;在這里沒有必要提供一個(gè)私有

          的構(gòu)造器,靜態(tài)工廠方法等是單例模式的傳統(tǒng)實(shí)現(xiàn)方式。
          ?這是一個(gè)POJO(普通的Java對象,自我維護(hù)自身的狀態(tài),處理本身的屬性及存取方法外,一般不

          提供任何API)。它不依賴于任何的Spring API。在Spring容器外,仍然可用,而且能夠在使用JUnit 測

          試時(shí),初始化該對象。但是,我們?nèi)匀皇褂寐暶魇绞聞?wù)管理,而依賴Spring的AOP。
          ?這個(gè)類給每個(gè)方法定義了一個(gè)默認(rèn)的事務(wù)屬性。
          ?注意,這個(gè)屬性定義僅僅在使用Commons Attribute auto-proxying (即使用Common Attribute

          或 Annotation時(shí), Annotation是Spring提供的API,所以依賴了Spring API或Common Attribute API)

          時(shí)才是必須使用的。
          在 war/WEB-INF 目錄下的默認(rèn)applicationContext.xml 文件中的TransactionFactoryProxyBean不需要

          定義attributes。
          而在接下來使用Commons Attributes attribute 語法來定義的attribute。

          6.?org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
          給iBATIS SqlMapClientDAO提供的方便的父類。需要設(shè)置一個(gè)SqlMapClient,提供給子類一個(gè)基于設(shè)入

          的SqlMapClient的SqlMapClinetTemplate。
          你也可以傳遞一個(gè)已經(jīng)配置好的SqlMapClientTemplate實(shí)例來代替?zhèn)鬟f一個(gè)SqlMapClient(也就是代替默

          認(rèn)的SqlMapClientTemplate,默認(rèn)的SqlMapClientTemplate使用了傳入的SqlMapClient)。這樣就使得你

          所有的DAO的分享同一個(gè)SqlMapClientTemplate配置,例如,一個(gè)自定義的SQLExceptionTranslator也可

          以使用這個(gè)SqlMapClientTemplate。

          7.? org.springframework.orm.ibatis.SqlMapClientTemplate
          ?一個(gè)幫助類,用來簡化使用iBATIS com.ibatis.sqlmap.client.SqlMapClient API進(jìn)行數(shù)據(jù)訪

          問,依照org.springframework.dao 異常模型,將被檢查性異常SQLExceptions轉(zhuǎn)換成不受檢測異常

          DataAccessExceptions。使用和org.springframework.jdbc.core.JdbcTemplate相同的

          org.springframework.jdbc.support.SQLExceptionTranslator機(jī)制。
          ?這個(gè)類的主要方法執(zhí)行了數(shù)據(jù)訪問行為的回調(diào)。此外,該類提供了眾多的方法去鏡像

          com.ibatis.sqlmap.client.SqlMapExecutor的執(zhí)行方法。
          ?這個(gè)模版一般都使用了方便而簡單的方法去執(zhí)行 query/insert/update/delete 操作。但是,

          更復(fù)雜的操作例如批量更新,就必須自定義一個(gè)SqlMapClientCallback,常常都是使用匿名的內(nèi)部類實(shí)

          現(xiàn)。例如:
          getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
          ?? public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
          ??? executor.startBatch();
          ??? executor.update("insertSomething", "myParamValue");
          ??? executor.update("insertSomethingElse", "myOtherParamValue");
          ??? executor.executeBatch();
          ??? return null;
          ?? }
          ?});
          ?這個(gè)模版需要一個(gè)SqlMapClient來工作,可以通過”sqlMapClient”屬性來傳遞。一個(gè)Spring

          上下文都典型地使用一個(gè)SqlMapClientFactoryBean去構(gòu)建SqlMapClient。模版還需要配置一個(gè)

          DataSource來取得連接,但是,如果在傳入的SqlMapClient中指定了DataSource(典型地,使用

          SqlMapClientFactoryBean的”dataSource”屬性),那么這不是必須的。
          ?所謂的回調(diào)就是指,一個(gè)對象通過調(diào)用另一個(gè)對象的方法來完成既定的行為(也可以說是委托

          給另一個(gè)對象來完成),而本對象可以去執(zhí)行其它的操作。
          8.? org.springframework.samples.jpetstore.web.struts. BaseAction
          ?JPetStore的Web層的所有Struts Action的父類
          從ServletContext中獲得WebApplicationContext,然后又從WebApplicationContext中獲得

          PetStoreFacade,然后通過一個(gè)getter方法提供給子類。(或者是繼承Spring提供的ActionSupport類,

          它預(yù)實(shí)現(xiàn)了WebApplicatinContext的查找)但是這里在Struts中插入了Spring的API。所以增加了耦合度

          ,該Action類及其子類不能脫離Spring使用,這里并不是最佳實(shí)踐。
          比較好的方式是:配置Spring將Action作為Bean托管,使用ContextLoaderPlugin,并在Spring context


          ?* 中設(shè)置依賴關(guān)系。具體看Spring手冊。

          9.?org.springframework.util.StringUtils
          String工具方法的混合類。
          主要在Spring框架內(nèi)工作;請參考Jakarta's Commons Lang 來了解更多而全面的String 工具類的信息


          這個(gè)提供了一些處理core Java String 和 StringBuffer的簡單功能,例如替換一個(gè)目標(biāo)字符串中所有

          給定的子字符串的功能。它也提供易使用的方法去轉(zhuǎn)換定界字符串,如CSV字符串,和集合以及數(shù)組。
          關(guān)于持久層DAO接口的好處(個(gè)人想法)
          ?事實(shí)上,在程序中有很多對象依賴了DAO,如果我們直接使用DAO,而不是使用DAO的接口的話,

          那么如果我們改變底層的數(shù)據(jù)庫時(shí)(或者是不同的ORM框架),相關(guān)的依賴該DAO的對象的類,或者配置

          必須修改。例如,我們使用AOP可配置編程時(shí),我們就必須修改織入的DAO,而如果我們使用DAO接口,我

          們可以直接織入到接口上,那么我們不需要修改任何代碼。業(yè)務(wù)層和持久層也應(yīng)該通過接口通信。
          ?同樣,DAO接口也獲得所有接口必將獲得的好處,那么就是耦合度的下降。
          ?具體來說就是,避免其它API的污染,增加API維護(hù)和使用的復(fù)雜性;另外就是提供給一個(gè)更靈

          活的多態(tài)實(shí)現(xiàn),也就是說在我們無法修改源碼的情況下,也能改變具體實(shí)現(xiàn),而且我們應(yīng)該總是避免,

          因?yàn)槲覀兂3]有這樣的權(quán)限,那么就要就API的設(shè)計(jì)者提供更好的實(shí)現(xiàn)(開--閉原理),這里是通過

          XML配置文件的方式。
          ?但是顯然,這里增加了間接性,增加了代碼量,似乎增加了復(fù)雜性,然而恰恰相反,合理的使

          用接口使得程序的結(jié)構(gòu)更加的清晰。
          ?JPetStore使用了SecureBaseAction 主要是提供了當(dāng)HttpSession中未包含登陸信息時(shí),跳到登

          陸頁面,其實(shí)所有擴(kuò)展了這個(gè)類的類的實(shí)例,都是需要在安全條件下(用戶權(quán)限控制)使用的,其實(shí)我們

          可以用filter代替。但是這樣顯然效率更高,但是耦合度也更高了,因?yàn)槲覀儾豢梢耘渲米约旱陌踩?/p>

          略了。
          ?JPetStore在Struts Web控制代碼中使用了大量的Spring API,其實(shí)這是不推薦使用的,例如,

          BaseAction中使用了WebApplicationContext;SearchProductsAction使用了

          org.springframework.util.StringUtils,還有使用很頻繁的

          org.springframework.beans.support.PagedListHolder。
          ?JPetStore在使用Struts時(shí),大量使用了HttpSession,好的建議是盡量少使用HttpSession,所

          以這里也不是好的實(shí)踐,例如,將所有的頁面都找出來,但是是緩存在HttpSession中,雖然提高了客戶

          端的用戶感受,但是會給服務(wù)器以沉重的負(fù)擔(dān)。
          ?JPetStore中將ActionForm做了兩種作用,一種主要是用于數(shù)據(jù)的提交(Form中用),一般以

          working開頭,一種主要用于處理過后的數(shù)據(jù)的顯示和數(shù)據(jù)的保存。因?yàn)槎际谴鎯υ贖ttpSession中,為

          了區(qū)分采用了不同的名字,而working FormBean的生命周期是在提交了數(shù)據(jù)后結(jié)束,因此在這時(shí),我們

          應(yīng)該將內(nèi)存空間收回。

          posted on 2009-11-04 21:16 vagasnail 閱讀(770) 評論(0)  編輯  收藏 所屬分類: Java Web


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 寿宁县| 琼海市| 栾城县| 红安县| 济宁市| 曲阳县| 綦江县| 同德县| 昌平区| 遵化市| 土默特右旗| 三穗县| 泾阳县| 灌阳县| 通海县| 木兰县| 抚宁县| 固安县| 泊头市| 定襄县| 建平县| 措美县| 封开县| 扎鲁特旗| 农安县| 申扎县| 金门县| 望谟县| 武强县| 靖安县| 江华| 马鞍山市| 八宿县| 高碑店市| 琼结县| 米林县| 麦盖提县| 务川| 花莲县| 敖汉旗| 伊吾县|