




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。三大框架Hibernate一.是什么:Hibernate是輕量級(jí)的ORM框架。1.ORM(ORMapping)ObjectRelationDBMappingJDBCHibernate做的就是中間的部分Application程序面向的是Object,操作的是Object,所以要吧DB中的數(shù)據(jù)映射成Object它才能使用2.Object與RDB之間映射關(guān)系的特點(diǎn)(Hibernate中)(1)類跟表相對應(yīng)(UserModel對應(yīng)于tbl_user)(2)類的屬性跟表的字段相對應(yīng)(3)類的實(shí)例與表中具體的一條記
2、錄相對應(yīng)(4)一個(gè)類可以對著多個(gè)表,一個(gè)表也可以對應(yīng)對個(gè)類(5)DB中的表可以沒有主鍵,但是Object中必須設(shè)置主鍵作為PK字段,不為空且唯一。所以DB跟Object并不是一一映射的(6)外鍵:DB中表與表之間的關(guān)系映射成為Object之間的關(guān)系。(7)table中字段的個(gè)數(shù)和名稱可以和Object中定義的不一樣,在部署連接文件中將兩者連接起來即可二.能干什么?Hibernate不僅僅管理java類到數(shù)據(jù)庫表的映射,還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時(shí)人工使用SQL和JDBC數(shù)據(jù)處理的時(shí)間。三.有什么?體系結(jié)構(gòu)圖SessionFactory針對單個(gè)數(shù)據(jù)庫映射經(jīng)過編譯后的內(nèi)存對
3、象,是線程安全的。他是生成Session的工廠Session表示應(yīng)用程序與持久層之間交互操作的一個(gè)單線程對象。持久化對象帶有持久化狀態(tài)的,具有業(yè)務(wù)功能的單線程對象。瞬時(shí)及托管對象那些沒有與session關(guān)聯(lián)的持久化類實(shí)例。事務(wù)Transaction應(yīng)用程序用來指定原子操作單元范圍的對象。ConnectionProvider連接池生成JDBC連接的工廠。TransactioinFactory生成Transaction對象實(shí)例的工廠。四.怎么用?1.構(gòu)建環(huán)境(建工程引包)2.建model建table3.做配置文件Hibernate文件分為兩類*.cfg.xml*.hbm.xml*.cfg.xmla
4、.缺省名稱為hibernate.cfg.xmlb.存放在當(dāng)前classes的根目錄下c.有如下四部分配置與DB連接可選配置(dialect)資源文件注冊(hbm.xml)二級(jí)緩存*.hbm.xmla.與被描述的類同名UserModel.hbm.xmlb.存放位置必須與所描述類存放在同一文件夾下c.四部分配置類和表的映射主鍵的映射類的屬性和DB中字段的映射關(guān)系的映射*類中默認(rèn)的cfg.xml文件是hibernate.cfg.xml若改變名稱,在類中使用時(shí)要指出newConfiguration().configure(“cc.cfg.xml”).buildSessionFactory;*標(biāo)準(zhǔn)的JE
5、E規(guī)范是通過服務(wù)器來實(shí)現(xiàn)的*Hibernate幫助我們做的是數(shù)據(jù)庫中數(shù)據(jù)的持久化。我們要做的是Object(App中)Table(DB中)Client(App中)xml(Hibernate)*Blob存儲(chǔ)多大4G的非結(jié)構(gòu)化二進(jìn)制數(shù)據(jù)Clob用來存儲(chǔ)多大4G的字符數(shù)據(jù)第三部分JDBC連接一.*.cfg.xml中JDBC連接最重要的設(shè)置.二.可選的配置屬性1.org.hibernate.dialect.Oracle9iDialect(必選的)2.true3.hibernate.connection.isolation設(shè)置JDBC事務(wù)隔離級(jí)別(建議選)4.hibernate.transaction.
6、factory-class想改變hibernate事務(wù)實(shí)現(xiàn)機(jī)制時(shí)用。事務(wù)策略配置有三個(gè)標(biāo)準(zhǔn)的選擇:org.hibernate.transaction.JDBCTransactionFactory授權(quán)給數(shù)據(jù)庫事務(wù)org.hibernate.JTATransactionFactoryJTA能做分布事務(wù)org.hibernate.transaction.CMTransactionFactory5.jta.userTransaction若四中選擇的是JTA則這個(gè)必須選擇6.hibernate.hbmzddl.auto自動(dòng)生成表三.JEE應(yīng)用程序服務(wù)器的集成1.container-managerddat
7、asource:Hibernate能使用通過容器管理,并有JNDI提供的JDBC連接2.自動(dòng)JNDI綁定:Hibernate可以將SessionFactory綁定到JNDI3.JTAsession綁定:HibernateSession可以自動(dòng)綁定到JTA事務(wù)作用的范圍,只需簡單的從JNDI中查找sessionFactory并獲得當(dāng)前的Session4.JMX部署第四章PersistenceClass一.POJO1.四條主要規(guī)則實(shí)現(xiàn)一個(gè)默認(rèn)的(即無參數(shù)的)構(gòu)造方法(constructor)提供一個(gè)標(biāo)識(shí)屬性(identifierproperty)使用非final的類為持久化字段聲明訪問器(acce
8、ssors)和是否可變的標(biāo)志(mutators)2.實(shí)現(xiàn)繼承(Inheritance)3.實(shí)現(xiàn)equals()和hashCode()4.Hibernate也支持動(dòng)態(tài)模型(在運(yùn)行期使用Map的Map)和象DOM4J的樹模型那樣的實(shí)體表示。使用這種方法,你不用寫持久化類,只寫映射文件就行了。第五章BasicO/RMapping一.1.hibernate-mappingschema(可選):數(shù)據(jù)庫schema的名稱。default-cascade(可選-默認(rèn)為none):默認(rèn)的級(jí)聯(lián)風(fēng)格。default-lazy(可選-默認(rèn)為true):指定了未明確注明lazy屬性的Java屬性和集合類,Hibern
9、ate會(huì)采取什么樣的默認(rèn)加載風(fēng)格。2.Classname(可選):持久化類(或者接口)的Java全限定名。如果這個(gè)屬性不存在,Hibernate將假定這是一個(gè)非POJO的實(shí)體映射。table(可選-默認(rèn)是類的非全限定名):對應(yīng)的數(shù)據(jù)庫表名。dynamic-update(可選,默認(rèn)為false):指定用于UPDATE的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那些改變過的字段。dynamic-insert(可選,默認(rèn)為false):指定用于INSERT的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段。optimistic-lock(樂觀鎖定)(可選,默認(rèn)是version):決定樂觀鎖定的策略。
10、lazy(可選):通過設(shè)置lazy=false,所有的延遲加載(Lazyfetching)功能將被全部禁用(disabled)。如果你打開了dynamic-update,你可以選擇幾種樂觀鎖定的策略:version(版本檢查)檢查version/timestamp字段all(全部)檢查全部字段dirty(臟檢查)只檢察修改過的字段none(不檢查)不使用樂觀鎖定3.id被映射的類必須定義對應(yīng)數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個(gè)JavaBeans風(fēng)格的屬性,為每一個(gè)實(shí)例包含唯一的標(biāo)識(shí)。元素定義了該屬性到數(shù)據(jù)庫表主鍵字段的映射。idname=propertyNametype=typenamecolum
11、n=column_namename(可選):標(biāo)識(shí)屬性的名字。type(可選):標(biāo)識(shí)Hibernate類型的名字。column(可選-默認(rèn)為屬性名):主鍵字段的名字。4.Generator可選的子元素是一個(gè)Java類的名字,用來為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)。uid_tablenext_hi_value_columnassigned讓應(yīng)用程序在save()之前為對象分配一個(gè)標(biāo)示符。這是元素沒有指定時(shí)的默認(rèn)生成策略。5.元素為類定義了一個(gè)持久化的,JavaBean風(fēng)格的屬性。name:屬性的名字,以小寫字母開頭。column(可選-默認(rèn)為屬性名字):對應(yīng)的數(shù)據(jù)庫字段名。也可以通過嵌套的元素指定。
12、type(可選):一個(gè)Hibernate類型的名字。第十章與對象共事1.Hibernate對象狀態(tài)(objectstates)瞬時(shí)(Transient)-由new操作符創(chuàng)建,且尚未與HibernateSession關(guān)聯(lián)的對象被認(rèn)定為瞬時(shí)(Transient)的。持久(Persistent)-持久(Persistent)的實(shí)例在數(shù)據(jù)庫中有對應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)(identifier)。脫管(Detached)-與持久(Persistent)對象關(guān)聯(lián)的Session被關(guān)閉后,對象就變?yōu)槊摴?Detached)的。2.裝載對象load和get區(qū)別:a.load先查內(nèi)存,有就用,沒有再查數(shù)據(jù)
13、庫。Get直接查數(shù)據(jù)庫。b.查數(shù)據(jù)庫沒有之后,load報(bào)例外,get返回null。3.修改持久對象先load出對象,在對其作修改,然后調(diào)用flush();4.修改脫管(Detached)對象Hibernate通過提供Session.update()或Session.merge()重新關(guān)聯(lián)脫管實(shí)例的辦法來支持這種模型。5.自動(dòng)狀態(tài)檢測Hibernate的用戶曾要求一個(gè)既可自動(dòng)分配新持久化標(biāo)識(shí)(identifier)保存瞬時(shí)(transient)對象,又可更新/重新關(guān)聯(lián)脫管(detached)實(shí)例的通用方法。saveOrUpdate()方法實(shí)現(xiàn)了這個(gè)功能。6.使用Session.delete()會(huì)
14、把對象的狀態(tài)從數(shù)據(jù)庫中移除。7.拼接hql字符串進(jìn)行查詢*Hinbernate中的緩存問題一、一級(jí)緩存一級(jí)緩存的生命周期和session的生命周期一致,當(dāng)前sessioin一旦關(guān)閉,一級(jí)緩存就消失,因此一級(jí)緩存也叫session級(jí)的緩存或事務(wù)級(jí)緩存,一級(jí)緩存只存實(shí)體對象的,它不會(huì)緩存一般的對象屬性(查詢緩存可以),即當(dāng)獲得對象后,就將該對象的緩存起來,如果在同一session中如果再去獲取這個(gè)對象時(shí),它會(huì)先判斷緩存中有沒有該對象的ID,如果有就直接從緩存中取出,反之則去數(shù)據(jù)庫中取,取的同時(shí)將該對象的緩存起來,有以下方法可以支持一級(jí)緩存:*get()*load()*iterate(查詢實(shí)體對象)
15、其中Query和Criteria的list()只會(huì)緩存,但不會(huì)使用緩存(除非結(jié)合查詢緩存)。二、二級(jí)緩存二級(jí)緩存也稱進(jìn)程級(jí)的緩存或SessionFactory級(jí)的緩存,二級(jí)緩存可以被所有的session共享,二級(jí)緩存的生命周期和SessionFactory的生命周期一致。hibernate為實(shí)現(xiàn)二級(jí)緩存,只提供二級(jí)緩存的接口供第三方來實(shí)現(xiàn)。二級(jí)緩存也是緩存實(shí)體對象,其實(shí)現(xiàn)原理與一級(jí)緩存的差不多吧,其方法與一級(jí)的相同,只是緩存的生命周期不一樣而已:*get()*load()*iterate(查詢實(shí)體對象)其中Query和Criteria的list()只會(huì)緩存,但不會(huì)使用緩存(除非結(jié)合查詢緩存)。
16、什么樣的數(shù)據(jù)適合存放到第二級(jí)緩存中?1、很少被修改的數(shù)據(jù)2、不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)3、不會(huì)被并發(fā)訪問的數(shù)據(jù)4、參考數(shù)據(jù)不適合存放到第二級(jí)緩存的數(shù)據(jù)?1、經(jīng)常被修改的數(shù)據(jù)2、財(cái)務(wù)數(shù)據(jù),絕對不允許出現(xiàn)并發(fā)3、與其他應(yīng)用共享的數(shù)據(jù)。*各種控制的流程1.save(model)topo事務(wù)判斷要不要提交。我們寫了mit(),他才會(huì)瓶sql往下走。通過po得到一個(gè)全路徑拼出model.hbm.xml,到.cfg.xml中找到hbm.xml。動(dòng)態(tài)拼sql。得到連接。執(zhí)行JDBC。2.update(model)注意:dynamic-update只生成改過的字段topo(dynamic-upd
17、atehuixianload一遍)mitpo找到model.hbm.xml拼sql得到連接執(zhí)行JDBC(merge其實(shí)是借用po的表,裝to,因?yàn)閟ession實(shí)力池中相同主鍵的實(shí)例只有一個(gè))3.get(model類,主鍵值;)(雙主鍵時(shí),傳一個(gè)封裝雙主鍵的主鍵類)依據(jù)model類找到model類.hbm.xml動(dòng)態(tài)拼sql執(zhí)行sql的rsrs類實(shí)例(反射技術(shù))load(model類,主鍵值;)在以上步驟前加一步:在內(nèi)存中查找4.query詞法分析(HQL)得到類名類名model.hbm.xml動(dòng)態(tài)拼sql會(huì)有兩個(gè)結(jié)果:object各個(gè)類實(shí)例的集合返回若cfg.xml中兩個(gè)model名稱相同,
18、路徑不同,則在xml中的類名部分要是全路徑Spring一.是什么:Java/JEEApplicationFramework二.有什么?COREAOP表現(xiàn)層DAOORM邏輯層層數(shù)據(jù)服務(wù)層JEESpringWebMVCwebworkstrutsSpringWeb三.能干什么Spring可以做一個(gè)超級(jí)的粘合平臺(tái),把我們所有用到的技術(shù)集成到一起,形成一個(gè)整體。(1)IOC/DI(Inversionofcontrol/DependencyInjection)(2)提供應(yīng)用的服務(wù)(3)AOP(4)各種技術(shù)的集成第三章控制反轉(zhuǎn)器1.IOC(InversionofControl)控制反轉(zhuǎn)ASpringBC正向
19、:App去控制外部東西反向:Spring控制AppAPPSpring控制了App所有的外部資源。(如A要調(diào)用B類或者C類時(shí),由Spring給A類提供,而不是在A類中直接調(diào)用。即A依賴于Spring給他注入外部資源)IOC/DI是從不同角度來說明控制反轉(zhuǎn)。2.(1)Bean:組成應(yīng)用的主體(backbone)及由SpringIOC容器所管理的對象。即由Spring容器初始化裝配及管理對象。(2)由Spring去控制App外部資源的優(yōu)點(diǎn):a.松散耦合b.是App模塊化,提高組件復(fù)用性c.由Spring組裝,理想是實(shí)現(xiàn)軟件工業(yè)化(3)接口應(yīng)用:ApplicationContextApplicatio
20、nContext完全由BeanFactory擴(kuò)展而來,因而BeanFactory所具備的能力和行為也適用于ApplicationContext。3.怎么用?(1)配置XML(applicationContextxml放到src的根目錄下)(2)搭建開發(fā)環(huán)境(3)寫App(4)Client調(diào)用4.怎么學(xué)?(主要是xml文件和ApplicationContext中的方法)(1)Bean的定義信息(applicationContextxml中)a.類的定義:全限頂類名,通常是已定義bean的實(shí)際實(shí)現(xiàn)類。如果通過調(diào)用staticFactory方法來實(shí)現(xiàn)實(shí)例化bean,而不是使用常見的construct
21、or,哪么類名實(shí)際上就是工廠類的類名b.行為的定義:及創(chuàng)建模式(prototype還是singleton),自動(dòng)裝配模式,以來檢查模式,初始化以及銷毀方法,這些定義決定bean在容器中的行為。c.Constructor的定義及屬性值(constructor有參無參)d.bean之間的關(guān)系(即在xml中要配置這四項(xiàng))*聲明事務(wù)的六種屬性Required/RequiredNew,Support/NotSupport,Mandatory/Never3.3依賴3.3.1注入依賴(DI)DI背后的基本原理是對象之間的依賴關(guān)系,只會(huì)通過以下幾種方式來實(shí)現(xiàn)(1)構(gòu)造器的參數(shù)(2)工廠方法的參數(shù)(3)構(gòu)造函數(shù)
22、或者工廠方法創(chuàng)建的對象設(shè)置屬性容器的工作就是創(chuàng)建bean時(shí)注入那些依賴關(guān)系DI有兩種注入方式(1)setter注入getter,setter方法都有缺陷,所以一般class中的屬性的前兩個(gè)字母都不要大寫,如JDBC中url,name,password,服務(wù)器的port等都可以通過注入實(shí)現(xiàn),邏輯層調(diào)用數(shù)據(jù)層時(shí)可將工廠改為給邏輯層注入一個(gè)接口即可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屬性顯示設(shè)置,也可用index屬性設(shè)置,默認(rèn)是按照在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)用一個(gè)singleton類型beanA的某個(gè)方法時(shí),需要引用另一個(gè)非singleton(prototype)類型的beanB,對于beanA來說,容器只會(huì)創(chuàng)建一次,這樣就沒法在需要的時(shí)候每次讓容器為beanA提供一個(gè)新的的beanB實(shí)例。Lookup方法注入利用了容器的覆蓋受容器管理的bean方法的能力,從而返回指定名字的bean實(shí)例。在上述場景中,Lookup方法注入適用
26、于原型bean(盡管它也適用于singletonbean,但在那種情況下直接注入一個(gè)實(shí)例就夠了)。Lookup方法注入的內(nèi)部機(jī)制是Spring利用了CGLIB庫在運(yùn)行時(shí)生成二進(jìn)制代碼功能,通過動(dòng)態(tài)創(chuàng)建Lookup方法bean的子類而達(dá)到復(fù)寫Lookup方法的目的。處理bean的依賴關(guān)系通常按一下步驟進(jìn)行a.根據(jù)定義bean的配置文件創(chuàng)建并初始化BeanFactory實(shí)例(或ApplicationContext)b.每個(gè)bean的依賴將以屬性構(gòu)造器參數(shù),或靜態(tài)工廠方法參數(shù)的形式出現(xiàn)。當(dāng)這些bean被實(shí)際創(chuàng)建時(shí),這些依賴也將會(huì)提供給該beanc.每個(gè)屬性或構(gòu)造參數(shù)既可以是一個(gè)實(shí)際的值,也可以是該容
27、器中另一個(gè)bean的引用d.每個(gè)指定的屬性或構(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傳給或元素,同時(shí)提供錯(cuò)誤驗(yàn)證功能。b.ref元素該元素用來將bean中指定屬性的值設(shè)置為對容器中的另外一個(gè)bean的引用。第一種形式:是通過使用標(biāo)記指定bean屬性的目標(biāo)bean,通過該標(biāo)簽可以引用同一容器或父容器內(nèi)的任何bean(無論是否在同一XML文件中)。XMLbean元素的值既可以是指定bean的id值也可
28、以是其name值。第二種形式是使用ref的local屬性指定目標(biāo)bean,它可以利用XML解析器來驗(yàn)證所引用的bean是否存在同一文件中。local屬性值必須是目標(biāo)bean的id屬性值。c.內(nèi)部bean所謂的內(nèi)部bean(innerbean)是指在一個(gè)bean的或元素中使用元素定義的bean。內(nèi)部bean定義不需要有id或name屬性。d.集合通過、及元素可以定義和設(shè)置與JavaCollection類型對應(yīng)List、Set、Map及Properties的值。e.Nullsf.組合屬性名稱當(dāng)設(shè)置bean的組合屬性時(shí),除了最后一個(gè)屬性外,只要其他屬性值不為null,組合或嵌套屬性名是完全合法的。f
29、oobean有個(gè)fred屬性,此屬性有個(gè)bob屬性,而bob屬性又有個(gè)sammy屬性,最后把sammy屬性設(shè)置為123。為了讓此定義能工作,foo的fred屬性及fred的bob屬性在bean被構(gòu)造后都必須非空,否則將拋出NullPointerException異常。g.depends-on多數(shù)情況下,一個(gè)bean對另一個(gè)bean的依賴最簡單的做法就是將一個(gè)bean設(shè)置為另外一個(gè)bean的屬性。在xml配置文件中最常見的就是使用元素。depends-on屬性可以用于當(dāng)前bean初始化之前顯式地強(qiáng)制一個(gè)或多個(gè)bean被初始化。h.延遲初始化beanApplicationContext實(shí)現(xiàn)的默認(rèn)行
30、為就是在啟動(dòng)時(shí)將所有singletonbean提前進(jìn)行實(shí)例化。一個(gè)延遲初始化bean將告訴IoC容器是在啟動(dòng)時(shí)還是在第一次被用到時(shí)實(shí)例化。i.自動(dòng)裝配(autowire)不要使用3.4.bean的作用域(*)1.Singleton作用域當(dāng)一個(gè)bean的作用域?yàn)閟ingleton,那么SpringIoC容器中只會(huì)存在一個(gè)共享的bean實(shí)例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會(huì)返回bean的同一實(shí)例。2.Prototype作用域Prototype作用域的bean會(huì)導(dǎo)致在每次對該bean請求(將其注入到另一個(gè)bean中,或者以程序的方式調(diào)用容器的getBean()方法)時(shí)
31、都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例。*對所有有狀態(tài)的bean應(yīng)該使用prototype作用域,而對無狀態(tài)的bean則應(yīng)該使用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所有的功能。為了以一種更向面向框架的方式工作以及對上下文進(jìn)行分
32、層和實(shí)現(xiàn)繼承,context包還提供了以下的功能:MessageSource,提供國際化的消息訪問資源訪問,如URL和文件事件傳播,實(shí)現(xiàn)了ApplicationListener接口的bean載入多個(gè)(有繼承關(guān)系)上下文,使得每一個(gè)上下文都專注于一個(gè)特定的層次,比如應(yīng)用的web層MessageSource,提供國際化的消息訪問StringgetMessage(Stringcode,Objectargs,Stringdefault,Localeloc):用來從MessageSource獲取消息的基本方法。如果在指定的locale中沒有找到消息,則使用默認(rèn)的消息。args中的參數(shù)將使用標(biāo)準(zhǔn)類庫中的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進(jìn)行面向切面
34、編程(AOP)一.AOP是什么?AOP是一種編程范式,他關(guān)注的是各個(gè)模塊間具有共性功能的情況下程序該如何解決。二.AOP有什么?目標(biāo)對象:包含了關(guān)注點(diǎn)功能的對象,會(huì)用到關(guān)注點(diǎn)動(dòng)能的對像,既是開始也是結(jié)束advice的。連接點(diǎn):在目標(biāo)對像中用來標(biāo)識(shí)或觸發(fā)一個(gè)切面的點(diǎn)。切入點(diǎn):連接點(diǎn)的集合。Advice:關(guān)注點(diǎn)功能的實(shí)現(xiàn),AOP將切面拿出來有advice實(shí)現(xiàn)。AOPProxy:動(dòng)態(tài)把Advice織入目標(biāo)對象??椚耄喊亚忻骀溄拥狡渌麘?yīng)用程序類型或?qū)ο笊稀G忻妫阂粋€(gè)關(guān)注點(diǎn)的模塊化功能的實(shí)現(xiàn)WeavingEboEboEboT1T2T1T2T1T2proxyAdviceSpring監(jiān)控連接點(diǎn):采用攔截監(jiān)控
35、,在xml中告訴springt1,t2方法為連接點(diǎn),t1,t2的集合為切入點(diǎn)。要監(jiān)控哪些方法,方法調(diào)用時(shí),spring就會(huì)攔截到,xml還配置了攔截點(diǎn)觸發(fā)器,Spring該如何處理(即去找advice)找到advice通過proxy在把功能回帖到targetObject上(weaving)。(targetobject完全不知情)以前的oo中是程序主動(dòng)調(diào)用外部的公共實(shí)現(xiàn)自己知道要什么功能知道要怎么調(diào)Spring是原始對象自己既不知道要什么功能,也不知道怎么調(diào)用的情況下,spring動(dòng)態(tài)的將新功能植入到其中。三.AOP能干什么?在不驚動(dòng)原來對象的情況下動(dòng)態(tài)織入1.AspectJ:可以攔截屬性,方法
36、功能比springAOP強(qiáng)大SpringAOP:只攔截方法,但Spring是一個(gè)體系,集成起來就強(qiáng)大了。Spring中使用AOP干什么?(1)提供聲明式企業(yè)服務(wù),最重要是的聲明式事務(wù)管理,建立在spring的抽象事務(wù)管理上。(2)允許用戶實(shí)現(xiàn)自定義的切面,用AOP來完善OOP的使用。2.Advice類型前置通知(Beforeadvice):在某連接點(diǎn)(joinpoint)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行(除非它拋出一個(gè)異常)。返回后通知(Afterreturningadvice):在某連接點(diǎn)(joinpoint)正常完成后執(zhí)行的通知:例如,一個(gè)方法沒有拋出任何異常,正常返回。拋
37、出異常后通知(Afterthrowingadvice):在方法拋出異常退出時(shí)執(zhí)行的通知。后通知(After(finally)advice):當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。環(huán)繞通知(AroundAdvice):包圍一個(gè)連接點(diǎn)(joinpoint)的通知,如方法調(diào)用。這是最強(qiáng)大的一種通知類型。環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來結(jié)束執(zhí)行。四.怎么做?我們要做的目標(biāo)對象,連接點(diǎn),xml,通知1.SpringAOP支持在切入點(diǎn)表達(dá)式中使用如下的AspectJ切入點(diǎn)指定者:execution-匹配方
38、法執(zhí)行的連接點(diǎn),這是你將會(huì)用到的Spring的最主要的切入點(diǎn)指定者。within-限定匹配特定類型的連接點(diǎn)(在使用SpringAOP的時(shí)候,在匹配的類型中定義的方法的執(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、的返回類型必須依次匹配一個(gè)連接點(diǎn)。最頻繁的返回類型模式是*,它代表了匹配任意的返回類型。名字模式匹配的是方法名。可以使用*通配符作為所有或者部分命名模式。參數(shù)模式:()匹配了一個(gè)不接受任何參數(shù)的方法,而(.)匹配了一個(gè)接受任意數(shù)量參數(shù)的方法(零或者更多)。模式(*)匹配了一個(gè)接受一個(gè)任何類型的參數(shù)的方法。模式(*,String)匹配了一個(gè)接受兩個(gè)參數(shù)的方法,第一個(gè)可以是任意類型,第二個(gè)則必須是String類型。3.ApplicationContext怎么配?方法1:注冊:切入點(diǎn)及其與advice之間的對應(yīng)關(guān)系。在xml中配置完后,在client中走Spring就可以了。方法2:使用Aspect
40、J支持。使用了Java5的注解,可以將切面聲明為普通的java類。啟動(dòng)AspectJ支持Xml中配置聲明一個(gè)切面packageorg.xyz;importorg.aspectj.lang.annotation.Aspect;AspectpublicclassNotVeryUsefulAspect聲明一個(gè)切入點(diǎn)(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.代理機(jī)制如果被代理的目標(biāo)對象實(shí)現(xiàn)了至少一個(gè)接口,則會(huì)使用JDK動(dòng)態(tài)代理。所有該目標(biāo)類型實(shí)現(xiàn)的接口都將被代理。若該目標(biāo)對象沒有實(shí)現(xiàn)任何接口,則創(chuàng)建一個(gè)CGLIB代理。完整實(shí)例:讓我們先寫兩個(gè)簡單的類: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,運(yùn)行一下:Hello,ImaMerryChristmasHi,ImbMerryChristmas第七章SpringAOPAPIs一.切入點(diǎn)實(shí)施:一般用正則表達(dá)式切入點(diǎn)(靜態(tài)切入點(diǎn))org.springframework.aop.support.Perl5RegexpMethodPointcut是一個(gè)最基本的正則表達(dá)式切入點(diǎn),它使用Perl5正則表達(dá)式語法。以提供一組模式字符串。如果其中任意一個(gè)模式匹配,切入點(diǎn)將被解析為true。(實(shí)際上就是這些切入點(diǎn)的或集。).
46、*set.*.*absquatulate二.AdviceAPIinSpring1.攔截around通知實(shí)現(xiàn)MethodInterceptor。2.前置通知publicinterfaceMethodBeforeAdviceextendsBeforeAdvicevoidbefore(Methodm,Objectargs,Objecttarget)throwsThrowable;實(shí)現(xiàn)before方法3.異常通知實(shí)現(xiàn)ThrowsAdvice接口的afterThrowing方法publicclassRemoteThrowsAdviceimplementsThrowsAdvicepublicvoidaft
47、erThrowing(RemoteExceptionex)throwsThrowable/Dosomethingwithremoteexception4.后置通知實(shí)現(xiàn)org.springframework.aop.AfterReturningAdvice接口publicinterfaceAfterReturningAdviceextendsAdvicevoidafterReturning(ObjectreturnValue,Methodm,Objectargs,Objecttarget)throwsThrowable;三.Spring里的advisor(Advisor)API在Spring里,
48、一個(gè)advisor是一個(gè)僅僅包含一個(gè)通知對象和與之關(guān)聯(lián)的切入點(diǎn)表達(dá)式的切面。第十章DAOSupport一.一致的異常層次Spring提供了一種方便的方法,把特定于某種技術(shù)的異常,如SQLException,轉(zhuǎn)化為自己的異常,這種異常屬于以DataAccessException為根的異常層次。這些異常封裝了原始異常對象,這樣就不會(huì)有丟失任何錯(cuò)誤信息的風(fēng)險(xiǎn)。二.一致的DAO支持抽象類Dao支持類:JdbcDaoSupport-JDBC數(shù)據(jù)訪問對象的基類。需要一個(gè)DataSource,同時(shí)為子類提供JdbcTemplate。HibernateDaoSupport-Hibernate數(shù)據(jù)訪問對象的基類
49、。需要一個(gè)SessionFactory,同時(shí)為子類提供HibernateTemplate。JdoDaoSupport-JDO數(shù)據(jù)訪問對象的基類。需要設(shè)置一個(gè)PersistenceManagerFactory,同時(shí)為子類提供JdoTemplate。JpaDaoSupport-JPA數(shù)據(jù)訪問對象的基類。需要一個(gè)EntityManagerFactory,同時(shí)為子類提供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作為一個(gè)幫助類提供易用且強(qiáng)大的數(shù)據(jù)庫訪問能力,我們可以使用該類提供的靜態(tài)方法從JNDI獲取數(shù)據(jù)庫連接以及在必要的時(shí)候關(guān)閉之。第十二章使用ORM工具進(jìn)行數(shù)據(jù)訪問Hibernateproduct.hbm.xmlhibernate.dialect=org.hibernate.dialect.MySQLDialect第九章:事務(wù)一.好處:為復(fù)雜的事務(wù)API提供了一致的編程模型,如JTA、JDBC、Hibernate、JPA和JDO支持HYPERLINKmk:MSITStore:D:Xunlei新建文件夾spring2.0-中文
52、參考手冊.chm:/ch09s05.htmlo9.5.聲明式事務(wù)管理聲明式事務(wù)管理提供比大多數(shù)復(fù)雜的事務(wù)API(諸如JTA)更簡單的,更易于使用的HYPERLINKmk:MSITStore:D:Xunlei新建文件夾spring2.0-中文參考手冊.chm:/ch09s06.htmlo9.6.編程式事務(wù)管理編程式事務(wù)管理API非常好地整合Spring的各種數(shù)據(jù)訪問抽象二.關(guān)鍵抽象事務(wù)隔離:當(dāng)前事務(wù)和其它事務(wù)的隔離的程度。例如,這個(gè)事務(wù)能否看到其他事務(wù)未提交的寫數(shù)據(jù)?事務(wù)傳播:通常在一個(gè)事務(wù)中執(zhí)行的所有代碼都會(huì)在這個(gè)事務(wù)中運(yùn)行。但是,如果一個(gè)事務(wù)上下文已經(jīng)存在,有幾個(gè)選項(xiàng)可以指定一個(gè)事務(wù)性方法的
53、執(zhí)行行為:例如,簡單地在現(xiàn)有的事務(wù)中繼續(xù)運(yùn)行(大多數(shù)情況);或者掛起現(xiàn)有事務(wù),創(chuàng)建一個(gè)新的事務(wù)。Spring提供EJBCMT中常見的事務(wù)傳播選項(xiàng)。事務(wù)超時(shí):事務(wù)在超時(shí)前能運(yùn)行多久(自動(dòng)被底層的事務(wù)基礎(chǔ)設(shè)施回滾)。只讀狀態(tài):只讀事務(wù)不修改任何數(shù)據(jù)。只讀事務(wù)在某些情況下(例如當(dāng)使用Hibernate時(shí)),是一種非常有用的優(yōu)化。三.配置使用TransactionalTransactionalpublicclassDefaultFooServiceimplementsFooServiceFoogetFoo(StringfooName);FoogetFoo(StringfooName,Stringbar
54、Name);voidinsertFoo(Foofoo);voidupdateFoo(Foofoo);Struts1.0一.Struts1是什么?基于MVC的輕量級(jí),web應(yīng)用框架。二.有什么?Strust1描述Strust2Servlet-ActionServlet控制器,接受用戶請求和狀態(tài)改變,以及發(fā)出視圖選擇FilterDispatcherAction控制器的一部分,與模型交互,執(zhí)行狀態(tài)改變或狀態(tài)查詢,以及告訴ActionServlet下一個(gè)選擇的視圖ActionForm狀態(tài)改變的數(shù)據(jù)voActionMapping狀態(tài)改變事件xwork.xmlActionForward用戶指向或者視圖選擇
55、Result三.運(yùn)行流程p=30,2,left1.提交requestweb容器(即tomcat);2.依據(jù)web應(yīng)用上下文找到web應(yīng)用;如:3.再依據(jù)部署描述文件web.xml找到ActionServletactionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xml2action*.do4.ActionServlet接著大致執(zhí)行順序如下:a.讀struts-config.xml形成ActionMappingb.依據(jù)path找到相應(yīng)的Action類定義c.依據(jù)action定義找到Form的定義d.把頁面
56、參數(shù)填充到Form中e.調(diào)用execute()f.執(zhí)行execute()得到ActionFowardg.依據(jù)ActionFoward到mapping中去下一個(gè)頁面四.怎么做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是一個(gè)JavaBean,需繼承org.apache.struts.action.ActionForm類,它捕獲通過HTTP請求傳送的參數(shù)ActionForm針對每個(gè)HTML表單中的字段具有一個(gè)對應(yīng)的屬性ActionServlet匹配請求中的參數(shù)和ActionForm中的屬性,并調(diào)用ActionForm中的setter方法,將參數(shù)傳入ActionForm我們的add.jsp有四個(gè)表單字段(下面將會(huì)看到),所以,我們需要定義ActionForm中相應(yīng)的setter方法ActionForm中的getter/setter方法,可以通過Eclipse集成環(huán)境,自動(dòng)生成ActionForm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 動(dòng)物檢疫合同范例
- 東城區(qū)物流合同范本
- 加裝電梯簽約合同范本
- 創(chuàng)藝裝飾合同范本
- 人教版七年級(jí)歷史與社會(huì)上冊教學(xué)設(shè)計(jì):3.1.1 稻作文化的印記
- 公司合伙合作合同范本
- 2025年超鈾元素及其提取設(shè)備項(xiàng)目申請報(bào)告模范
- 2025年涂鍍添加劑項(xiàng)目規(guī)劃申請報(bào)告
- 2025年超高分子量聚乙烯項(xiàng)目提案報(bào)告模范
- 2025年鋰電池用特種玻璃粉項(xiàng)目立項(xiàng)申請報(bào)告
- 《陶瓷工藝技術(shù)》課件
- 供電所安全演講
- 深度學(xué)習(xí)架構(gòu)創(chuàng)新-深度研究
- 供應(yīng)鏈韌性提升與風(fēng)險(xiǎn)防范-深度研究
- 基層醫(yī)療衛(wèi)生服務(wù)能力提升考核試卷
- 化工原理完整(天大版)課件
- 2025年江蘇連云港市贛榆城市建設(shè)發(fā)展集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 砥礪前行決心譜寫華章
- 2025年開學(xué)教導(dǎo)處發(fā)言稿(5篇)
- 機(jī)電設(shè)備安裝旁站監(jiān)理方案
- 2025年度民政局離婚協(xié)議書范本模板官方修訂2篇
評論
0/150
提交評論