三大框架復習過程_第1頁
三大框架復習過程_第2頁
三大框架復習過程_第3頁
三大框架復習過程_第4頁
三大框架復習過程_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。三大框架Hibernate一.是什么:Hibernate是輕量級的ORM框架。1.ORM(ORMapping)ObjectRelationDBMappingJDBCHibernate做的就是中間的部分Application程序面向的是Object,操作的是Object,所以要吧DB中的數(shù)據(jù)映射成Object它才能使用2.Object與RDB之間映射關系的特點(Hibernate中)(1)類跟表相對應(UserModel對應于tbl_user)(2)類的屬性跟表的字段相對應(3)類的實例與表中具體的一條記

2、錄相對應(4)一個類可以對著多個表,一個表也可以對應對個類(5)DB中的表可以沒有主鍵,但是Object中必須設置主鍵作為PK字段,不為空且唯一。所以DB跟Object并不是一一映射的(6)外鍵:DB中表與表之間的關系映射成為Object之間的關系。(7)table中字段的個數(shù)和名稱可以和Object中定義的不一樣,在部署連接文件中將兩者連接起來即可二.能干什么?Hibernate不僅僅管理java類到數(shù)據(jù)庫表的映射,還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時人工使用SQL和JDBC數(shù)據(jù)處理的時間。三.有什么?體系結(jié)構(gòu)圖SessionFactory針對單個數(shù)據(jù)庫映射經(jīng)過編譯后的內(nèi)存對

3、象,是線程安全的。他是生成Session的工廠Session表示應用程序與持久層之間交互操作的一個單線程對象。持久化對象帶有持久化狀態(tài)的,具有業(yè)務功能的單線程對象。瞬時及托管對象那些沒有與session關聯(lián)的持久化類實例。事務Transaction應用程序用來指定原子操作單元范圍的對象。ConnectionProvider連接池生成JDBC連接的工廠。TransactioinFactory生成Transaction對象實例的工廠。四.怎么用?1.構(gòu)建環(huán)境(建工程引包)2.建model建table3.做配置文件Hibernate文件分為兩類*.cfg.xml*.hbm.xml*.cfg.xmla

4、.缺省名稱為hibernate.cfg.xmlb.存放在當前classes的根目錄下c.有如下四部分配置與DB連接可選配置(dialect)資源文件注冊(hbm.xml)二級緩存*.hbm.xmla.與被描述的類同名UserModel.hbm.xmlb.存放位置必須與所描述類存放在同一文件夾下c.四部分配置類和表的映射主鍵的映射類的屬性和DB中字段的映射關系的映射*類中默認的cfg.xml文件是hibernate.cfg.xml若改變名稱,在類中使用時要指出newConfiguration().configure(“cc.cfg.xml”).buildSessionFactory;*標準的JE

5、E規(guī)范是通過服務器來實現(xiàn)的*Hibernate幫助我們做的是數(shù)據(jù)庫中數(shù)據(jù)的持久化。我們要做的是Object(App中)Table(DB中)Client(App中)xml(Hibernate)*Blob存儲多大4G的非結(jié)構(gòu)化二進制數(shù)據(jù)Clob用來存儲多大4G的字符數(shù)據(jù)第三部分JDBC連接一.*.cfg.xml中JDBC連接最重要的設置.二.可選的配置屬性1.org.hibernate.dialect.Oracle9iDialect(必選的)2.true3.hibernate.connection.isolation設置JDBC事務隔離級別(建議選)4.hibernate.transaction.

6、factory-class想改變hibernate事務實現(xiàn)機制時用。事務策略配置有三個標準的選擇:org.hibernate.transaction.JDBCTransactionFactory授權(quán)給數(shù)據(jù)庫事務org.hibernate.JTATransactionFactoryJTA能做分布事務org.hibernate.transaction.CMTransactionFactory5.jta.userTransaction若四中選擇的是JTA則這個必須選擇6.hibernate.hbmzddl.auto自動生成表三.JEE應用程序服務器的集成1.container-managerddat

7、asource:Hibernate能使用通過容器管理,并有JNDI提供的JDBC連接2.自動JNDI綁定:Hibernate可以將SessionFactory綁定到JNDI3.JTAsession綁定:HibernateSession可以自動綁定到JTA事務作用的范圍,只需簡單的從JNDI中查找sessionFactory并獲得當前的Session4.JMX部署第四章PersistenceClass一.POJO1.四條主要規(guī)則實現(xiàn)一個默認的(即無參數(shù)的)構(gòu)造方法(constructor)提供一個標識屬性(identifierproperty)使用非final的類為持久化字段聲明訪問器(acce

8、ssors)和是否可變的標志(mutators)2.實現(xiàn)繼承(Inheritance)3.實現(xiàn)equals()和hashCode()4.Hibernate也支持動態(tài)模型(在運行期使用Map的Map)和象DOM4J的樹模型那樣的實體表示。使用這種方法,你不用寫持久化類,只寫映射文件就行了。第五章BasicO/RMapping一.1.hibernate-mappingschema(可選):數(shù)據(jù)庫schema的名稱。default-cascade(可選-默認為none):默認的級聯(lián)風格。default-lazy(可選-默認為true):指定了未明確注明lazy屬性的Java屬性和集合類,Hibern

9、ate會采取什么樣的默認加載風格。2.Classname(可選):持久化類(或者接口)的Java全限定名。如果這個屬性不存在,Hibernate將假定這是一個非POJO的實體映射。table(可選-默認是類的非全限定名):對應的數(shù)據(jù)庫表名。dynamic-update(可選,默認為false):指定用于UPDATE的SQL將會在運行時動態(tài)生成,并且只更新那些改變過的字段。dynamic-insert(可選,默認為false):指定用于INSERT的SQL將會在運行時動態(tài)生成,并且只包含那些非空值字段。optimistic-lock(樂觀鎖定)(可選,默認是version):決定樂觀鎖定的策略。

10、lazy(可選):通過設置lazy=false,所有的延遲加載(Lazyfetching)功能將被全部禁用(disabled)。如果你打開了dynamic-update,你可以選擇幾種樂觀鎖定的策略:version(版本檢查)檢查version/timestamp字段all(全部)檢查全部字段dirty(臟檢查)只檢察修改過的字段none(不檢查)不使用樂觀鎖定3.id被映射的類必須定義對應數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個JavaBeans風格的屬性,為每一個實例包含唯一的標識。元素定義了該屬性到數(shù)據(jù)庫表主鍵字段的映射。idname=propertyNametype=typenamecolum

11、n=column_namename(可選):標識屬性的名字。type(可選):標識Hibernate類型的名字。column(可選-默認為屬性名):主鍵字段的名字。4.Generator可選的子元素是一個Java類的名字,用來為該持久化類的實例生成唯一的標識。uid_tablenext_hi_value_columnassigned讓應用程序在save()之前為對象分配一個標示符。這是元素沒有指定時的默認生成策略。5.元素為類定義了一個持久化的,JavaBean風格的屬性。name:屬性的名字,以小寫字母開頭。column(可選-默認為屬性名字):對應的數(shù)據(jù)庫字段名。也可以通過嵌套的元素指定。

12、type(可選):一個Hibernate類型的名字。第十章與對象共事1.Hibernate對象狀態(tài)(objectstates)瞬時(Transient)-由new操作符創(chuàng)建,且尚未與HibernateSession關聯(lián)的對象被認定為瞬時(Transient)的。持久(Persistent)-持久(Persistent)的實例在數(shù)據(jù)庫中有對應的記錄,并擁有一個持久化標識(identifier)。脫管(Detached)-與持久(Persistent)對象關聯(lián)的Session被關閉后,對象就變?yōu)槊摴?Detached)的。2.裝載對象load和get區(qū)別:a.load先查內(nèi)存,有就用,沒有再查數(shù)據(jù)

13、庫。Get直接查數(shù)據(jù)庫。b.查數(shù)據(jù)庫沒有之后,load報例外,get返回null。3.修改持久對象先load出對象,在對其作修改,然后調(diào)用flush();4.修改脫管(Detached)對象Hibernate通過提供Session.update()或Session.merge()重新關聯(lián)脫管實例的辦法來支持這種模型。5.自動狀態(tài)檢測Hibernate的用戶曾要求一個既可自動分配新持久化標識(identifier)保存瞬時(transient)對象,又可更新/重新關聯(lián)脫管(detached)實例的通用方法。saveOrUpdate()方法實現(xiàn)了這個功能。6.使用Session.delete()會

14、把對象的狀態(tài)從數(shù)據(jù)庫中移除。7.拼接hql字符串進行查詢*Hinbernate中的緩存問題一、一級緩存一級緩存的生命周期和session的生命周期一致,當前sessioin一旦關閉,一級緩存就消失,因此一級緩存也叫session級的緩存或事務級緩存,一級緩存只存實體對象的,它不會緩存一般的對象屬性(查詢緩存可以),即當獲得對象后,就將該對象的緩存起來,如果在同一session中如果再去獲取這個對象時,它會先判斷緩存中有沒有該對象的ID,如果有就直接從緩存中取出,反之則去數(shù)據(jù)庫中取,取的同時將該對象的緩存起來,有以下方法可以支持一級緩存:*get()*load()*iterate(查詢實體對象)

15、其中Query和Criteria的list()只會緩存,但不會使用緩存(除非結(jié)合查詢緩存)。二、二級緩存二級緩存也稱進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享,二級緩存的生命周期和SessionFactory的生命周期一致。hibernate為實現(xiàn)二級緩存,只提供二級緩存的接口供第三方來實現(xiàn)。二級緩存也是緩存實體對象,其實現(xiàn)原理與一級緩存的差不多吧,其方法與一級的相同,只是緩存的生命周期不一樣而已:*get()*load()*iterate(查詢實體對象)其中Query和Criteria的list()只會緩存,但不會使用緩存(除非結(jié)合查詢緩存)。

16、什么樣的數(shù)據(jù)適合存放到第二級緩存中?1、很少被修改的數(shù)據(jù)2、不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)3、不會被并發(fā)訪問的數(shù)據(jù)4、參考數(shù)據(jù)不適合存放到第二級緩存的數(shù)據(jù)?1、經(jīng)常被修改的數(shù)據(jù)2、財務數(shù)據(jù),絕對不允許出現(xiàn)并發(fā)3、與其他應用共享的數(shù)據(jù)。*各種控制的流程1.save(model)topo事務判斷要不要提交。我們寫了mit(),他才會瓶sql往下走。通過po得到一個全路徑拼出model.hbm.xml,到.cfg.xml中找到hbm.xml。動態(tài)拼sql。得到連接。執(zhí)行JDBC。2.update(model)注意:dynamic-update只生成改過的字段topo(dynamic-upd

17、atehuixianload一遍)mitpo找到model.hbm.xml拼sql得到連接執(zhí)行JDBC(merge其實是借用po的表,裝to,因為session實力池中相同主鍵的實例只有一個)3.get(model類,主鍵值;)(雙主鍵時,傳一個封裝雙主鍵的主鍵類)依據(jù)model類找到model類.hbm.xml動態(tài)拼sql執(zhí)行sql的rsrs類實例(反射技術)load(model類,主鍵值;)在以上步驟前加一步:在內(nèi)存中查找4.query詞法分析(HQL)得到類名類名model.hbm.xml動態(tài)拼sql會有兩個結(jié)果:object各個類實例的集合返回若cfg.xml中兩個model名稱相同,

18、路徑不同,則在xml中的類名部分要是全路徑Spring一.是什么:Java/JEEApplicationFramework二.有什么?COREAOP表現(xiàn)層DAOORM邏輯層層數(shù)據(jù)服務層JEESpringWebMVCwebworkstrutsSpringWeb三.能干什么Spring可以做一個超級的粘合平臺,把我們所有用到的技術集成到一起,形成一個整體。(1)IOC/DI(Inversionofcontrol/DependencyInjection)(2)提供應用的服務(3)AOP(4)各種技術的集成第三章控制反轉(zhuǎn)器1.IOC(InversionofControl)控制反轉(zhuǎn)ASpringBC正向

19、:App去控制外部東西反向:Spring控制AppAPPSpring控制了App所有的外部資源。(如A要調(diào)用B類或者C類時,由Spring給A類提供,而不是在A類中直接調(diào)用。即A依賴于Spring給他注入外部資源)IOC/DI是從不同角度來說明控制反轉(zhuǎn)。2.(1)Bean:組成應用的主體(backbone)及由SpringIOC容器所管理的對象。即由Spring容器初始化裝配及管理對象。(2)由Spring去控制App外部資源的優(yōu)點:a.松散耦合b.是App模塊化,提高組件復用性c.由Spring組裝,理想是實現(xiàn)軟件工業(yè)化(3)接口應用:ApplicationContextApplicatio

20、nContext完全由BeanFactory擴展而來,因而BeanFactory所具備的能力和行為也適用于ApplicationContext。3.怎么用?(1)配置XML(applicationContextxml放到src的根目錄下)(2)搭建開發(fā)環(huán)境(3)寫App(4)Client調(diào)用4.怎么學?(主要是xml文件和ApplicationContext中的方法)(1)Bean的定義信息(applicationContextxml中)a.類的定義:全限頂類名,通常是已定義bean的實際實現(xiàn)類。如果通過調(diào)用staticFactory方法來實現(xiàn)實例化bean,而不是使用常見的construct

21、or,哪么類名實際上就是工廠類的類名b.行為的定義:及創(chuàng)建模式(prototype還是singleton),自動裝配模式,以來檢查模式,初始化以及銷毀方法,這些定義決定bean在容器中的行為。c.Constructor的定義及屬性值(constructor有參無參)d.bean之間的關系(即在xml中要配置這四項)*聲明事務的六種屬性Required/RequiredNew,Support/NotSupport,Mandatory/Never3.3依賴3.3.1注入依賴(DI)DI背后的基本原理是對象之間的依賴關系,只會通過以下幾種方式來實現(xiàn)(1)構(gòu)造器的參數(shù)(2)工廠方法的參數(shù)(3)構(gòu)造函數(shù)

22、或者工廠方法創(chuàng)建的對象設置屬性容器的工作就是創(chuàng)建bean時注入那些依賴關系DI有兩種注入方式(1)setter注入getter,setter方法都有缺陷,所以一般class中的屬性的前兩個字母都不要大寫,如JDBC中url,name,password,服務器的port等都可以通過注入實現(xiàn),邏輯層調(diào)用數(shù)據(jù)層時可將工廠改為給邏輯層注入一個接口即可publicclassExampleBeanprivateAnotherBeanbeanOne;privateYetAnotherBeanbeanTwo;privateinti;publicvoidsetBeanOne(AnotherBeanbeanOne

23、)this.beanOne=beanOne;publicvoidsetBeanTwo(YetAnotherBeanbeanTwo)this.beanTwo=beanTwo;publicvoidsetIntegerProperty(inti)this.i=i;(2)構(gòu)造器注入Java中一般都是屬性私有化,通過public的getter和setter來交互。在構(gòu)造器參數(shù)定義中使用type屬性顯示設置,也可用index屬性設置,默認是按照在bean中聲明屬性的順序。優(yōu)先選index,次選type最后選default。publicclassExampleBeanprivateAnotherBeanbe

24、anOne;privateYetAnotherBeanbeanTwo;privateinti;publicExampleBean(AnotherBeananotherBean,YetAnotherBeanyetAnotherBean,inti)this.beanOne=anotherBean;this.beanTwo=yetAnotherBean;this.i=i;publicclassExampleBeanprivateExampleBean(.).publicstaticExampleBeancreateInstance(AnotherBeananotherBean,YetAnotherB

25、eanyetAnotherBean,inti)ExampleBeaneb=newExampleBean(.);/someotheroperations.returneb;(3)方法注入對于具有不同生命周期的bean來說,在調(diào)用一個singleton類型beanA的某個方法時,需要引用另一個非singleton(prototype)類型的beanB,對于beanA來說,容器只會創(chuàng)建一次,這樣就沒法在需要的時候每次讓容器為beanA提供一個新的的beanB實例。Lookup方法注入利用了容器的覆蓋受容器管理的bean方法的能力,從而返回指定名字的bean實例。在上述場景中,Lookup方法注入適用

26、于原型bean(盡管它也適用于singletonbean,但在那種情況下直接注入一個實例就夠了)。Lookup方法注入的內(nèi)部機制是Spring利用了CGLIB庫在運行時生成二進制代碼功能,通過動態(tài)創(chuàng)建Lookup方法bean的子類而達到復寫Lookup方法的目的。處理bean的依賴關系通常按一下步驟進行a.根據(jù)定義bean的配置文件創(chuàng)建并初始化BeanFactory實例(或ApplicationContext)b.每個bean的依賴將以屬性構(gòu)造器參數(shù),或靜態(tài)工廠方法參數(shù)的形式出現(xiàn)。當這些bean被實際創(chuàng)建時,這些依賴也將會提供給該beanc.每個屬性或構(gòu)造參數(shù)既可以是一個實際的值,也可以是該容

27、器中另一個bean的引用d.每個指定的屬性或構(gòu)造器參數(shù)值必須能夠被轉(zhuǎn)換成屬性或構(gòu)造參數(shù)所需的類型3.3.3bean屬性及構(gòu)造器參數(shù)詳解1.直接量(基本類型、Strings類型等。)元素通過字符串來指定屬性或構(gòu)造器參數(shù)的值。a.idref元素idref元素用來將容器內(nèi)其它bean的id傳給或元素,同時提供錯誤驗證功能。b.ref元素該元素用來將bean中指定屬性的值設置為對容器中的另外一個bean的引用。第一種形式:是通過使用標記指定bean屬性的目標bean,通過該標簽可以引用同一容器或父容器內(nèi)的任何bean(無論是否在同一XML文件中)。XMLbean元素的值既可以是指定bean的id值也可

28、以是其name值。第二種形式是使用ref的local屬性指定目標bean,它可以利用XML解析器來驗證所引用的bean是否存在同一文件中。local屬性值必須是目標bean的id屬性值。c.內(nèi)部bean所謂的內(nèi)部bean(innerbean)是指在一個bean的或元素中使用元素定義的bean。內(nèi)部bean定義不需要有id或name屬性。d.集合通過、及元素可以定義和設置與JavaCollection類型對應List、Set、Map及Properties的值。e.Nullsf.組合屬性名稱當設置bean的組合屬性時,除了最后一個屬性外,只要其他屬性值不為null,組合或嵌套屬性名是完全合法的。f

29、oobean有個fred屬性,此屬性有個bob屬性,而bob屬性又有個sammy屬性,最后把sammy屬性設置為123。為了讓此定義能工作,foo的fred屬性及fred的bob屬性在bean被構(gòu)造后都必須非空,否則將拋出NullPointerException異常。g.depends-on多數(shù)情況下,一個bean對另一個bean的依賴最簡單的做法就是將一個bean設置為另外一個bean的屬性。在xml配置文件中最常見的就是使用元素。depends-on屬性可以用于當前bean初始化之前顯式地強制一個或多個bean被初始化。h.延遲初始化beanApplicationContext實現(xiàn)的默認行

30、為就是在啟動時將所有singletonbean提前進行實例化。一個延遲初始化bean將告訴IoC容器是在啟動時還是在第一次被用到時實例化。i.自動裝配(autowire)不要使用3.4.bean的作用域(*)1.Singleton作用域當一個bean的作用域為singleton,那么SpringIoC容器中只會存在一個共享的bean實例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。2.Prototype作用域Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調(diào)用容器的getBean()方法)時

31、都會創(chuàng)建一個新的bean實例。*對所有有狀態(tài)的bean應該使用prototype作用域,而對無狀態(tài)的bean則應該使用singleton作用域。3.request4.session5.globalsession3.5.定制bean特性3.5.1.Lifecycle接口a.初始化回調(diào)即在XML配置文件中通過指定init-method屬性來完成。b.析構(gòu)回調(diào)在XML配置文件中通過指定destroy-method屬性來完成。3.8.ApplicationContext它由BeanFactory接口派生而來,因而提供了BeanFactory所有的功能。為了以一種更向面向框架的方式工作以及對上下文進行分

32、層和實現(xiàn)繼承,context包還提供了以下的功能:MessageSource,提供國際化的消息訪問資源訪問,如URL和文件事件傳播,實現(xiàn)了ApplicationListener接口的bean載入多個(有繼承關系)上下文,使得每一個上下文都專注于一個特定的層次,比如應用的web層MessageSource,提供國際化的消息訪問StringgetMessage(Stringcode,Objectargs,Stringdefault,Localeloc):用來從MessageSource獲取消息的基本方法。如果在指定的locale中沒有找到消息,則使用默認的消息。args中的參數(shù)將使用標準類庫中的M

33、essageFormat來作消息中替換值。formatexceptionswindows#inpertiesmessage=Alligatorsrock!publicstaticvoidmain(Stringargs)MessageSourceresources=newClassPathXmlApplicationContext(beans.xml);Stringmessage=resources.getMessage(message,null,Default,null);System.out.println(message);Alligatorsrock!第六章:使用Spring進行面向切面

34、編程(AOP)一.AOP是什么?AOP是一種編程范式,他關注的是各個模塊間具有共性功能的情況下程序該如何解決。二.AOP有什么?目標對象:包含了關注點功能的對象,會用到關注點動能的對像,既是開始也是結(jié)束advice的。連接點:在目標對像中用來標識或觸發(fā)一個切面的點。切入點:連接點的集合。Advice:關注點功能的實現(xiàn),AOP將切面拿出來有advice實現(xiàn)。AOPProxy:動態(tài)把Advice織入目標對象??椚耄喊亚忻骀溄拥狡渌麘贸绦蝾愋突?qū)ο笊稀G忻妫阂粋€關注點的模塊化功能的實現(xiàn)WeavingEboEboEboT1T2T1T2T1T2proxyAdviceSpring監(jiān)控連接點:采用攔截監(jiān)控

35、,在xml中告訴springt1,t2方法為連接點,t1,t2的集合為切入點。要監(jiān)控哪些方法,方法調(diào)用時,spring就會攔截到,xml還配置了攔截點觸發(fā)器,Spring該如何處理(即去找advice)找到advice通過proxy在把功能回帖到targetObject上(weaving)。(targetobject完全不知情)以前的oo中是程序主動調(diào)用外部的公共實現(xiàn)自己知道要什么功能知道要怎么調(diào)Spring是原始對象自己既不知道要什么功能,也不知道怎么調(diào)用的情況下,spring動態(tài)的將新功能植入到其中。三.AOP能干什么?在不驚動原來對象的情況下動態(tài)織入1.AspectJ:可以攔截屬性,方法

36、功能比springAOP強大SpringAOP:只攔截方法,但Spring是一個體系,集成起來就強大了。Spring中使用AOP干什么?(1)提供聲明式企業(yè)服務,最重要是的聲明式事務管理,建立在spring的抽象事務管理上。(2)允許用戶實現(xiàn)自定義的切面,用AOP來完善OOP的使用。2.Advice類型前置通知(Beforeadvice):在某連接點(joinpoint)之前執(zhí)行的通知,但這個通知不能阻止連接點前的執(zhí)行(除非它拋出一個異常)。返回后通知(Afterreturningadvice):在某連接點(joinpoint)正常完成后執(zhí)行的通知:例如,一個方法沒有拋出任何異常,正常返回。拋

37、出異常后通知(Afterthrowingadvice):在方法拋出異常退出時執(zhí)行的通知。后通知(After(finally)advice):當某連接點退出的時候執(zhí)行的通知(不論是正常返回還是異常退出)。環(huán)繞通知(AroundAdvice):包圍一個連接點(joinpoint)的通知,如方法調(diào)用。這是最強大的一種通知類型。環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會選擇是否繼續(xù)執(zhí)行連接點或直接返回它們自己的返回值或拋出異常來結(jié)束執(zhí)行。四.怎么做?我們要做的目標對象,連接點,xml,通知1.SpringAOP支持在切入點表達式中使用如下的AspectJ切入點指定者:execution-匹配方

38、法執(zhí)行的連接點,這是你將會用到的Spring的最主要的切入點指定者。within-限定匹配特定類型的連接點(在使用SpringAOP的時候,在匹配的類型中定義的方法的執(zhí)行)。2.executionpointcutdesignator格式如下:execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)除了返回類型模式(上面代碼片斷中的ret-type-pattern),名字模式和參數(shù)模式以外,所有的部分都是可選的。返回類型模式?jīng)Q定了方法

39、的返回類型必須依次匹配一個連接點。最頻繁的返回類型模式是*,它代表了匹配任意的返回類型。名字模式匹配的是方法名。可以使用*通配符作為所有或者部分命名模式。參數(shù)模式:()匹配了一個不接受任何參數(shù)的方法,而(.)匹配了一個接受任意數(shù)量參數(shù)的方法(零或者更多)。模式(*)匹配了一個接受一個任何類型的參數(shù)的方法。模式(*,String)匹配了一個接受兩個參數(shù)的方法,第一個可以是任意類型,第二個則必須是String類型。3.ApplicationContext怎么配?方法1:注冊:切入點及其與advice之間的對應關系。在xml中配置完后,在client中走Spring就可以了。方法2:使用Aspect

40、J支持。使用了Java5的注解,可以將切面聲明為普通的java類。啟動AspectJ支持Xml中配置聲明一個切面packageorg.xyz;importorg.aspectj.lang.annotation.Aspect;AspectpublicclassNotVeryUsefulAspect聲明一個切入點(pointcut)Pointcut(execution(*transfer(.)privatevoidanyOldTransfer()/聲明advice,importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.ann

41、otation.Before;AspectpublicclassBeforeExampleBefore(com.xyz.myapp.SystemArchitecture.dataAccessOperation()publicvoiddoAccessCheck()/.4.代理機制如果被代理的目標對象實現(xiàn)了至少一個接口,則會使用JDK動態(tài)代理。所有該目標類型實現(xiàn)的接口都將被代理。若該目標對象沒有實現(xiàn)任何接口,則創(chuàng)建一個CGLIB代理。完整實例:讓我們先寫兩個簡單的類:packageom.longthsoft.learn.spring.models;publicclassApublicvoidsay

42、Hello()System.out.println(Hello,Ima);packagecom.longthsoft.learn.spring.models;publicclassBpublicvoidsayHi()System.out.println(Hi,Imb);packagecom.longthsoft.learn.spring;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;impo

43、rtcom.longthsoft.learn.spring.models.A;importcom.longthsoft.learn.spring.models.B;publicfinalclassBootpublicstaticvoidmain(Stringargs)ApplicationContextctx=newClassPathXmlApplicationContext(applicationContext.xml);Aa=(A)ctx.getBean(a);a.sayHello();Bb=(B)ctx.getBean(b);b.sayHi();packagecom.longthsoft

44、.learn.spring;importorg.aspectj.lang.annotation.AfterReturning;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Pointcut;AspectpublicclassSimpleAspectPointcut(execution(*com.longthsoft.learn.spring.models.*.say*()publicvoidsimplePointcut()AfterReturning(pointcut=simplePoint

45、cut()publicvoidsimpleAdvice()System.out.println(MerryChristmas);OK,運行一下:Hello,ImaMerryChristmasHi,ImbMerryChristmas第七章SpringAOPAPIs一.切入點實施:一般用正則表達式切入點(靜態(tài)切入點)org.springframework.aop.support.Perl5RegexpMethodPointcut是一個最基本的正則表達式切入點,它使用Perl5正則表達式語法。以提供一組模式字符串。如果其中任意一個模式匹配,切入點將被解析為true。(實際上就是這些切入點的或集。).

46、*set.*.*absquatulate二.AdviceAPIinSpring1.攔截around通知實現(xiàn)MethodInterceptor。2.前置通知publicinterfaceMethodBeforeAdviceextendsBeforeAdvicevoidbefore(Methodm,Objectargs,Objecttarget)throwsThrowable;實現(xiàn)before方法3.異常通知實現(xiàn)ThrowsAdvice接口的afterThrowing方法publicclassRemoteThrowsAdviceimplementsThrowsAdvicepublicvoidaft

47、erThrowing(RemoteExceptionex)throwsThrowable/Dosomethingwithremoteexception4.后置通知實現(xiàn)org.springframework.aop.AfterReturningAdvice接口publicinterfaceAfterReturningAdviceextendsAdvicevoidafterReturning(ObjectreturnValue,Methodm,Objectargs,Objecttarget)throwsThrowable;三.Spring里的advisor(Advisor)API在Spring里,

48、一個advisor是一個僅僅包含一個通知對象和與之關聯(lián)的切入點表達式的切面。第十章DAOSupport一.一致的異常層次Spring提供了一種方便的方法,把特定于某種技術的異常,如SQLException,轉(zhuǎn)化為自己的異常,這種異常屬于以DataAccessException為根的異常層次。這些異常封裝了原始異常對象,這樣就不會有丟失任何錯誤信息的風險。二.一致的DAO支持抽象類Dao支持類:JdbcDaoSupport-JDBC數(shù)據(jù)訪問對象的基類。需要一個DataSource,同時為子類提供JdbcTemplate。HibernateDaoSupport-Hibernate數(shù)據(jù)訪問對象的基類

49、。需要一個SessionFactory,同時為子類提供HibernateTemplate。JdoDaoSupport-JDO數(shù)據(jù)訪問對象的基類。需要設置一個PersistenceManagerFactory,同時為子類提供JdoTemplate。JpaDaoSupport-JPA數(shù)據(jù)訪問對象的基類。需要一個EntityManagerFactory,同時為子類提供JpaTemplate。三.NamedParameterJdbcTemplate類NamedParameterJdbcTemplate類增加了在SQL語句中使用命名參數(shù)的支持。publicintcountOfActorsByFirstN

50、ame(StringfirstName)Stringsql=selectcount(0)fromT_ACTORwherefirst_name=:first_name;NamedParameterJdbcTemplatetemplate=newNamedParameterJdbcTemplate(this.getDataSource();SqlParameterSourcenamedParameters=newMapSqlParameterSource(first_name,firstName);returntemplate.queryForInt(sql,namedParameters);四.

51、控制數(shù)據(jù)庫連接DataSourceUtils類DataSourceUtils作為一個幫助類提供易用且強大的數(shù)據(jù)庫訪問能力,我們可以使用該類提供的靜態(tài)方法從JNDI獲取數(shù)據(jù)庫連接以及在必要的時候關閉之。第十二章使用ORM工具進行數(shù)據(jù)訪問Hibernateproduct.hbm.xmlhibernate.dialect=org.hibernate.dialect.MySQLDialect第九章:事務一.好處:為復雜的事務API提供了一致的編程模型,如JTA、JDBC、Hibernate、JPA和JDO支持HYPERLINKmk:MSITStore:D:Xunlei新建文件夾spring2.0-中文

52、參考手冊.chm:/ch09s05.htmlo9.5.聲明式事務管理聲明式事務管理提供比大多數(shù)復雜的事務API(諸如JTA)更簡單的,更易于使用的HYPERLINKmk:MSITStore:D:Xunlei新建文件夾spring2.0-中文參考手冊.chm:/ch09s06.htmlo9.6.編程式事務管理編程式事務管理API非常好地整合Spring的各種數(shù)據(jù)訪問抽象二.關鍵抽象事務隔離:當前事務和其它事務的隔離的程度。例如,這個事務能否看到其他事務未提交的寫數(shù)據(jù)?事務傳播:通常在一個事務中執(zhí)行的所有代碼都會在這個事務中運行。但是,如果一個事務上下文已經(jīng)存在,有幾個選項可以指定一個事務性方法的

53、執(zhí)行行為:例如,簡單地在現(xiàn)有的事務中繼續(xù)運行(大多數(shù)情況);或者掛起現(xiàn)有事務,創(chuàng)建一個新的事務。Spring提供EJBCMT中常見的事務傳播選項。事務超時:事務在超時前能運行多久(自動被底層的事務基礎設施回滾)。只讀狀態(tài):只讀事務不修改任何數(shù)據(jù)。只讀事務在某些情況下(例如當使用Hibernate時),是一種非常有用的優(yōu)化。三.配置使用TransactionalTransactionalpublicclassDefaultFooServiceimplementsFooServiceFoogetFoo(StringfooName);FoogetFoo(StringfooName,Stringbar

54、Name);voidinsertFoo(Foofoo);voidupdateFoo(Foofoo);Struts1.0一.Struts1是什么?基于MVC的輕量級,web應用框架。二.有什么?Strust1描述Strust2Servlet-ActionServlet控制器,接受用戶請求和狀態(tài)改變,以及發(fā)出視圖選擇FilterDispatcherAction控制器的一部分,與模型交互,執(zhí)行狀態(tài)改變或狀態(tài)查詢,以及告訴ActionServlet下一個選擇的視圖ActionForm狀態(tài)改變的數(shù)據(jù)voActionMapping狀態(tài)改變事件xwork.xmlActionForward用戶指向或者視圖選擇

55、Result三.運行流程p=30,2,left1.提交requestweb容器(即tomcat);2.依據(jù)web應用上下文找到web應用;如:3.再依據(jù)部署描述文件web.xml找到ActionServletactionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xml2action*.do4.ActionServlet接著大致執(zhí)行順序如下:a.讀struts-config.xml形成ActionMappingb.依據(jù)path找到相應的Action類定義c.依據(jù)action定義找到Form的定義d.把頁面

56、參數(shù)填充到Form中e.調(diào)用execute()f.執(zhí)行execute()得到ActionFowardg.依據(jù)ActionFoward到mapping中去下一個頁面四.怎么做1.創(chuàng)建ActionFormpackagecn.javass.s2test.vo;importjava.io.Serializable;importjava.util.*;importorg.apache.struts.action.ActionForm;publicclassUserFormextendsActionFormimplementsSerializableprivateStringuuid,userId,nam

57、e;privateintage;privateCollectionufCol=newArrayList();OverridepublicStringtoString()returnuuid=+uuid+userId=+userId+name=+name+age=+age+ufCol=+ufCol;publicStringgetUuid()returnuuid;publicvoidsetUuid(Stringuuid)this.uuid=uuid;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicin

58、tgetAge()returnage;publicvoidsetAge(intage)this.age=age;publicinthashCode()finalintprime=31;intresult=1;result=prime*result+(uuid=null)?0:uuid.hashCode();returnresult;publicbooleanequals(Objectobj)if(this=obj)returntrue;if(obj=null)returnfalse;if(getClass()!=obj.getClass()returnfalse;finalUserFormot

59、her=(UserForm)obj;if(uuid=null)if(other.uuid!=null)returnfalse;elseif(!uuid.equals(other.uuid)returnfalse;returntrue;publicStringgetUserId()returnuserId;publicvoidsetUserId(StringuserId)this.userId=userId;publicCollectiongetUfCol()returnufCol;publicvoidsetUfCol(CollectionufCol)this.ufCol=ufCol;說明:Ac

60、tionForm是一個JavaBean,需繼承org.apache.struts.action.ActionForm類,它捕獲通過HTTP請求傳送的參數(shù)ActionForm針對每個HTML表單中的字段具有一個對應的屬性ActionServlet匹配請求中的參數(shù)和ActionForm中的屬性,并調(diào)用ActionForm中的setter方法,將參數(shù)傳入ActionForm我們的add.jsp有四個表單字段(下面將會看到),所以,我們需要定義ActionForm中相應的setter方法ActionForm中的getter/setter方法,可以通過Eclipse集成環(huán)境,自動生成ActionForm

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論