




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 /30開源框架Seasar2在日本,Seasar2這個框架十分的流行。Seasar2其實就是類似于Spring的一個開源框架大家有興趣的話,可以去官方網(wǎng)站看看:/index-html中文版現(xiàn)在還沒完善,大家可能要用日文或則英文來了解下面簡單介紹一下:所謂“Seasar2”就是一個“輕量級容器”,面向無法擺脫“Java應(yīng)用開發(fā)”之煩惱的所謂“開發(fā)者”,它能夠保證開發(fā)的“高生產(chǎn)率和高品質(zhì)”。并且同“其它輕量級容器”不同的是,“完全不需要書寫設(shè)定文件”,“就算是應(yīng)用程序發(fā)生改動也無需再次起動即可直接識別變更,因此具有腳本語言的靈活性”。為了不用寫設(shè)定文件也能夠運行,ConventionoverCo
2、nfiguration的思想得以采用。ConventionoverConfiguration就是指,“只要遵守一個適當(dāng)?shù)囊?guī)約,即使不用進(jìn)行非常麻煩的設(shè)定,框架結(jié)構(gòu)也可以自動替我們搞定的思想”,這一思想是RubyonRails中所倡導(dǎo)的。Seasar2的ConventionoverConfiguration是從RubyonRails那里得到的提示而產(chǎn)生的。使用Seasar2的話,對于僅僅需要維護(hù)數(shù)據(jù)表這樣簡單的應(yīng)用,可以在不到3分鐘的時間里作成。應(yīng)用程序發(fā)生改動之時也無需啟動便可立即識別變更的機(jī)能在Seasar2里被稱為HOTdeploy。安裝:S2需要安裝JDK1.4orJDK1.5。將S2x
3、xx.zip解壓之后的seasar2目錄引入到Eclipse、文件導(dǎo)入既存的工程。使用Seasar2基本功能(S2Container,S2AOP)的時候、CLASSPATH的下面必須包含以下文件。lib/aopallianceT.O.jarlib/commons-loggingT.l.jarlib/javassist-3.4.ga.jarlib/ognl-2.6.9-patch-20070624.jarlib/s2-framework-2.x.x.jarlib/geronimo-j2ee_1.4_specT.0.jar(參考下面)lib/portlet-apiT.O.jar(任選項)lib/l
4、og4j-1.2.13.jar(任選項)resources/perties(任選項)resources/aop.dicon(任選項)使用Seasar2的擴(kuò)張機(jī)能(S2JTA,S2DBCP,S2JDBC,S2Unit,S2Tx,S2DataSet)的時候必須要將以下文件追加到CLASSPATH里面。lib/junit-3.8.2.jarlib/poi-2.5-final-20040804.jarlib/s2-extension-2.x.x.jarlib/geronimo-jta_l.l_specT.O.jar(參考下面)lib/geronimo-ejb_2.1_specT.0.jar(參考下面)
5、resources/jdbc.dicon根據(jù)應(yīng)用軟件所需的執(zhí)行環(huán)境、選擇以下需要引用的文件geronimo-j2ee_1.4_specT.0.jar、geronimo-jta_1.0.1B_specT.0.jar、geronimo-ejb_2.1_specT.0.jar環(huán)境geronimo-j2ee1.4spec-1.0.jargeronimo-jta1.1spec-1.0.jargeronimo-ejb2.1spec-1.0.jar不完全對應(yīng)J2EE的不要要要Servletcontainer(Tomcat等)(使用S2JTA,S2Tx的時候)(使用S2Tiger的時候)完全對應(yīng)J2EE的應(yīng)用
6、服務(wù)器(JBoss,WebSphere,WebLogic等)不要不要不要獨立要(使用S2JTA,S2Tx時候)不要不要為了讓大家更簡單的體驗數(shù)據(jù)庫機(jī)能、使用了HSQLDB作為RDBMS。為了能夠體驗Oracle機(jī)能、準(zhǔn)備了hsql/sql/demo-oracle.sql。SQL*Plus等執(zhí)行了之后、請根據(jù)環(huán)境的需要改寫jdbc.dicon的XADataSourcelmpI的設(shè)定項冃。請使用S2Container用的插件Kijimuna想使用EJB3anoteshon的情況下、將S2TigerXXX.zip解壓縮后的s2-tiger目錄引入Eclipse、文件導(dǎo)入既存的工程。在Seasar2的
7、設(shè)定基礎(chǔ)上、必需要將以下的文件追加到CLASSPATH里面。lib/s2-tiger-x.x.x.jarresources/jdbc.dicon想使用Tigeranoteshon的情況、將S2TigerXXX.zip解凍后的s2-tiger目錄引入Eclipse、文件進(jìn)口既存的項目。在Seasar2的設(shè)定基礎(chǔ)上、必需要將以下的文件追加到CLASSPATH里面。lib/s2-tiger-x.x.x.jar快速上手S2Container,就是進(jìn)行DependencyInjection(注:依賴注入譯者)(以后略稱為DI)的一個輕量級容器。DI,就是Interface和實裝分離,程序相互之間僅通過I
8、nterface來會話的一種思考方式。最初的一步讓我們趕快試一試吧。登場人物如下。問候語類o返回問候語的字符串。問候客戶端類o從問候類獲得問候語(字符串)并輸出到終端屏幕。問候語應(yīng)用主類o啟動用的類。用來組織問候語類和問候語使用者類的組成方式。Greeting.java問侯語的Interface。packageexamplesdi;publicinterfaceGreetingStringgreet();GreetingImpl.java問候語的實裝。packageexamples.di.impl;importexamples.di.Greeting;publicclassGreetinglm
9、plimplementsGreetingpublicStringgreet()returnHelloWorld!;GreetingClient.java使用問候語的使用者客戶端Interface。packageexamplesdi;publicinterfaceGreetingClientvoidexecute();GreetingClientImpl.java使用問候語的客戶端的實裝。不是直接使用這個GreetngImpl(實裝),而是通過Greeting(Interface)來實現(xiàn)問候的機(jī)能。packageexamplesdiimpl;importexamplesdiGreeting;im
10、portexamplesdiGreetingClient;publicclassGreetingClientImplimplementsGreetingClientprivateGreetinggreeting;publicvoidsetGreeting(Greetinggreeting)thisgreeting=greeting;publicvoidexecute()Systemoutprintln(greetinggreet();機(jī)能提供端和使用端的準(zhǔn)備都完成了。下面我們就執(zhí)行一下試試吧。GreetingMain.javapackageexamplesdimain;importexampl
11、esdiGreeting;importexamples.di.impl.GreetingClientImpl;importexamples.di.impl.Greetinglmpl;publicclassGreetingMainpublicstaticvoidmain(Stringargs)Greetinggreeting=newGreetinglmpl();GreetingClientlmplgreetingClient=newGreetingClientImpl();greetingClient.setGreeting(greeting);greetingClient.execute。;實
12、行結(jié)果如下。HelloWorld!象這樣機(jī)能的使用者(GreetingClientImpl)經(jīng)由Interface(Greeting)的中介來使用機(jī)能,具體的機(jī)能對象(既Interface的實裝類)在實行的時候由第三者(在這里是GreetingMain)來提供的情況,就是DI的基本思考方法。但是,如果象GreetingMain中那樣實裝類的設(shè)定內(nèi)容直接被寫出來的話,一旦實裝類需要變更的時候源代碼也必須跟著修正。為了避免這個麻煩,DIContainer就登場了。把實裝設(shè)定抽出到一個設(shè)定文件中,由DIContainer把這個設(shè)定文件讀入并組織對象運行。那么,讓我們試著把剛才的提到的那個設(shè)定文件的內(nèi)
13、容寫一下。S2Container中,設(shè)定文件的后綴是dicon。GreetingMain2.dicon!D0CTYPEcomponentsPUBLIC-/SEASAR/DTDS2Container2.3/ENhttp:/www.seasarorg/dtd/components23dtdcomponentscomponentname二greetingclass二examples.di.impl.GreetingImpl/greeting/property上文記載的是組件的定義。在這里,相當(dāng)于如下的Java代碼。Greetinggreeting=newGreetingImpl();componen
14、t標(biāo)簽的name屬性指定了組件的名稱,class屬性指定了組件的Java類文件名。下文就是greetingClient的設(shè)定。greetingproperty標(biāo)簽的name屬性指定了組件Java類中的屬性名,標(biāo)簽的定義體則指定了一個組件名稱。這個設(shè)定相當(dāng)于如下Java代碼。組件名要注意不要用括起來。用括起來的話就會被當(dāng)作字符串來處理了。GreetingClientlmplgreetingclient=newGreetingClientImpl();greetingClient.setGreeting(greeting);利用S2Container的起動類的內(nèi)容如下。GreetingMain2.
15、javapackageexamplesdimain;importorg.seasarframework.containerS2Container;importorgseasarframework.containerfactory.S2ContainerFactory;importexamplesdiGreetingClient;publicclassGreetingMain2privatestaticfinalStringPATH=examples/di/dicon/GreetingMain2.dicon;publicstaticvoidmain(Stringargs)S2Containerc
16、ontainer=S2ContainerFactory.create(PATH);containerinit();GreetingClientgreetingClient=(GreetingClient)containergetComponent(greetingClient);greetingClient.execute。;S2Container,是由S2ContainerFactory#create(Stringpath)做成的。更加詳細(xì)的內(nèi)容請參照S2Container的牛成組件(greetingClient),是由S2Container#getComponent(Stringcompo
17、nentName)的方法取得的。詳細(xì)內(nèi)容請參照組件的取得實行結(jié)果同先前一樣表示如下。HelloWorld!經(jīng)常同DI一起使用的是AOP。AOP是指、將日志等的輸出分散到復(fù)數(shù)個類中的邏輯模塊化的一種技術(shù)。那么、讓我們不修改已經(jīng)作成的Greetinglmpl、GreetingClinetImpl的源代碼?試著將日志(追蹤)輸出。適用于AOP的設(shè)定文件如下。GreetingMain3.dicon!DOCTYPEcomponentsPUBLIC/SEASAR/DTDS2Container2.3/ENhttp:/wwwseasarorg/dtd/components23dtdaoptracelnterc
18、eptor/aspectpropertyname=greetinggreeting/propertyaspectaop.tracelnterceptor/aspect/component/componentsSeasar2中,經(jīng)常使用的AOP模塊在aop.dicon中預(yù)先定義。象下面這樣、使用include標(biāo)簽。更加詳細(xì)的?敬請參照S2Container定義的分解和引入。(includepath=aop.dicon/對于在組件中適用的AOP來說?我們component標(biāo)簽的字標(biāo)簽aspect標(biāo)簽的正文中指定AOP的模塊名稱。aop.tracelnterceptor是AOP模塊的名字。aspec
19、taop.tracelnterceptor/aspectAOP的設(shè)定如上所述。那么就讓我們執(zhí)行一下GreetingMain3吧。同GreetingMain2不同的僅僅是設(shè)定文件的路徑而已。GreetingMain3.javapackageexamples.di.main;importorg.seasar.framework.container.S2Container;importorg.seasar.framework.container.factory.S2ContainerFactory;importexamples.di.GreetingClient;publicclassGreetin
20、gMain3privatestaticfinalStringPATH=examples/di/dicon/GreetingMain3.dicon;publicstaticvoidmain(Stringargs)S2Containercontainer=S2ContainerFactory.create(PATH);GreetingClientgreetingClient=(GreetingClient)container.getComponent(greetingClient);greetingClient.execute();執(zhí)行結(jié)果如下??梢悦靼滓稽c,沒有修改源代碼,日志就被輸出了。DEB
21、UG2005-10-1121:01:49,655mainBEGINexamples.di.impl.GreetingClientImpl#execute()DEBUG2005-10-1121:01:49,665mainBEGINexamples.di.impl.GreetingImpl#greet()DEBUG2005-10-1121:01:49,665mainENDexamples.di.impl.GreetingImpl#greet():HelloWorld!HelloWorld!DEBUG2005-10-1121:01:49,675mainENDexamples.di.impl.Gree
22、tingClientImpl#execute():null這樣、S2Container的基本使用方法就被掌握了。更進(jìn)一步但是,不管怎么說書寫設(shè)定文件都是一件麻煩的事啊。在S2Container中,為了盡可能的減少設(shè)定文件的記述量、采用了如下的概念。ConventionoverConfiguration就是說制定一個適當(dāng)?shù)囊?guī)約,遵守這個規(guī)約的話?無需什么設(shè)定也可以運作。比如說,剛才的設(shè)定文件中,象下面這樣明確地指定屬性的部分存在著。componentname=greetingClientclass=examples.di.impl.GreetingClientImplpropertyname=g
23、reetinggreeting/property/componentS2Container中、屬性的類型是Interface的情形下?如果要將屬性類型的實裝組件注冊進(jìn)軟件容器中,不需要什么特殊的設(shè)定也可以自動得運作DI的機(jī)能。這就是,如果遵守DI中推薦的所謂“屬性類型用Interface定義的規(guī)則,S2Container會自動地處理一切。雖然一說到規(guī)約就容易產(chǎn)生麻煩之類的想法,“推薦而已,如果遵守的話就能使開發(fā)愉快”的話,遵守規(guī)約的動機(jī)就產(chǎn)生了。這才是問題的重點。如上的設(shè)定,可以做如下化簡(componentname=greetingClientclass=examples.di.impl.G
24、reetingClientImpl/component實際上?剛才的AOP的例子也適用“ConventionoverConfiguration”。通常在AOP中,AOP的模塊在什么地方適用是由pointcut指定的,S2AOP的情況下?如果遵守所謂“使用Interface”這個推薦的規(guī)約,不指定pointcut,自動的適用于在Interface中定義的所有方法。因為有這個機(jī)能,在剛才的那個例子中,就沒有必要指定pointcut。雖然根據(jù)“ConventionoverConfiguration”,DI和AOP的設(shè)定可以得以簡化,需要處理的組件數(shù)增加了、僅僅組件的注冊也會變成一個非常累的作業(yè)。那么
25、這個組件注冊自動化就叫做組件自動注冊機(jī)能。剛才的GreetingImpl、GreetingClientImpl的注冊自動化如下。(componentclass=org.seasar.framework.container.autoregister.FileSystemComponentAutoRegisterinitMethodname=addClassPatternargexamples.di.impl/argarg.*Impl/arg/initMethodFileSystemComponentAutoRegister組件將addClassPattern方法指定的類從文件系統(tǒng)中探尋出來,自動
26、注冊到S2Container中。關(guān)于initMethod標(biāo)簽,請參照方法函數(shù)注入。addClassPattern方法的第一個參數(shù)是想要注冊的組件的包的名字。子包的內(nèi)容也會用回歸的方式檢索。第二個參數(shù)是類的名字??梢允褂谜齽t表達(dá)式。也可以用“,”做分隔符指定復(fù)數(shù)個設(shè)定。根據(jù)組件自動注冊原則,即使后續(xù)追加組件的情況下,也沒有必要追加設(shè)定,這樣手續(xù)就大大地簡化了。如果組件的自動化注冊可以了,接下來就會想讓AOP的注冊也自動化了吧。剛才的GreetingImpl、GreetingClientImp的AOP注冊自動化的設(shè)定如下。componentclass=org.seasar.framework.co
27、ntainer.autoregister.AspectAutoRegisterpropertyname=interceptoraop.traceInterceptor/propertyargexamples.di.impl/argarg.*Impl/arg/initMethod/component用interceptor屬性指定AOP的名稱。addClassPattern方法同組件的自動化注冊時的用法一樣,這里就不做特殊的說明了。組件自動化注冊和AOP自動化注冊的例子如下。GreetingMain4dicon!DOCTYPEcomponentsPUBLIC-/SEASAR/DTDS2Conta
28、iner2.3/ENhttp:/www.seasarorg/dtd/components23dtdcomponentsincludepath二aopdicon/componentclass二orgseasarframework.container.autoregisterFileSystemComponentAutoRegisterinitMethodname二addClassPatternargexamplesdiimpl/arg*Impl/argaoptracelnterceptor/propertyexamplesdiimpl/arg*Impl/arg那么來執(zhí)行一下GreetingMai
29、n4吧。自動注冊的情況下,S2Container#init()和S2Container#destroy()的調(diào)用是必要的。GreetingMain4java,packageexamplesdimain;importorgseasarframework.containerS2Container;importorgseasarframework.containerfactory.S2ContainerFactory;importexamplesdiGreetingClient;publicclassGreetingMain4privatestaticfinalStringPATH=examples
30、/di/dicon/GreetingMain4.dicon;publicstaticvoidmain(Stringargs)S2Containercontainer=S2ContainerFactory.create(PATH);containerinit();tryGreetingClientgreetingClient=(GreetingClient)containergetComponent(greetingClient);greetingClientexecute();finallycontainerdestroy();執(zhí)行的結(jié)果同GreetingMain3樣如下列出。DEBUG200
31、5-10-1216:00:08,093mainBEGINexamples.di.impl.GreetingClientImpl#execute()DEBUG2005-10-1216:00:08,103mainBEGINexamples.di.impl.GreetingImpl#greet()DEBUG2005-10-1216:00:08,103mainENDexamples.di.impl.GreetingImpl#greet():HelloWorld!HelloWorld!DEBUG2005-10-1216:00:08,103mainENDexamples.di.impl.GreetingC
32、lientImpl#execute():null大多數(shù)的情況下?自動注冊和自動綁定的組合方式都能順利的進(jìn)行下去。不想要自動注冊的組件存在的情況下,自動注冊組件中準(zhǔn)備了addlgnoreClassPattern方法,可以指定自動注冊外的組件。不想要自動綁定的屬性存在的情況下,使用Binding備注碼,不使用設(shè)定文件也可以做細(xì)節(jié)的調(diào)整。使用Hotswap的話?應(yīng)用程序在運行中重新書寫更換類文件,馬上就能夠直接測試結(jié)果。不需要一個一個地將應(yīng)用程序在啟動,因此開發(fā)的效率能夠得到大幅度的提高?,F(xiàn)在,關(guān)于S2Container的高級使用方法也可以掌握了。這之后嘛,只要根據(jù)需要參照對應(yīng)的操作手冊就可以了。S
33、2Container參考需要作成的文件為了使用S2Container,定義文件的做成是必要的。定義文件就像是為了組織組件而制作的設(shè)計書一樣的東西。形式為XML,后綴為dicon。S2Container的定義S2Container的定義、象下面這樣。!D0CTYPEcomponentsPUBLIC-/SEASAR/DTDS2Container2.3/EN HYPERLINK /dtd/components23.dtd /dtd/components23.dtdcomponentscomponentname=.class=./componentcomponentname=.class=./comp
34、onent/componentsDOCTYPE是不能省略的。dicon做成的時候、請將前述例子拷貝粘貼。根是components標(biāo)簽。每一個組件用component標(biāo)簽定義。用component標(biāo)簽的class屬性指定組件的類的全名。在name屬性中、指定組件的名稱。詳細(xì)內(nèi)容請參照S2Container定義標(biāo)簽參考。S2Container的生成S2Container的生成方法有兩種。使用SingletonS2ContainerFactory。使用S2ContainerFactory。使用SingletonS2ContainerFactory使用SingletonS2ContainerFacto
35、ry的情況下,使用如下方法。org.seasar.framework.container.factory.SingletonS2ContainerFactory#init()定義文件使用的是CLASSPATH所指定的路徑中存在的app.dicon。做成的S2Container,無論在什么地方都是可以從如下方法中取得。org.seasar.framework.container.factory.SingletonS2ContainerFactory#getContainer()SingletonS2ContainerFactory.init();S2Containercontainer=Sing
36、letonS2ContainerFactory.getContainer();定義文件的路徑需要被指定的情況下應(yīng)在調(diào)用init()之前執(zhí)行如下方法。-org.seasar.framework.container.factory.SingletonS2ContainerFactory#setConfigPath(StringPath)參數(shù)path是相對于以CLASSPATH指定的路徑為根的定義文件的絕對路徑。例如,WEB-INF/classes/aaa.dicon的情況下就是aaa.dicon,WEB-INF/classes/aaa/bbb/ccc.dicon的情況下就是aaa/bbb/ccc.
37、dicon。分隔符在Windows和Unix下都是/。privatestaticfinalStringPATH=aaa/bbb/ccc.dicon;SingletonS2ContainerFactory.setConfigPath(PATH);SingletonS2ContainerFactory.init();S2Containercontainer=SingletonS2ContainerFactory.getContainer();使用S2ContainerFactory使用S2ContainerFactory的場合下,使用如下方法。一org.seasar.framework.conta
38、iner.factory.S2ContainerFactory#create(Stringpath)S2Container生成之后需要許呼叫下一個方法。org.seasar.framework.container.S2Container#init()privatestaticfinalStringPATH=aaa/bbb/ccc.dicon;S2Containercontainer=S2ContainerFactory.create(PATH);container.init();用這個方法取得的組件的實例,有必要進(jìn)行在應(yīng)用中的管理。組件的取得從S2Container中將組件取出來,使用下面的方
39、法。一org.seasar.framework.container.S2Container#getComponent(0bjectcomponentKey)參數(shù)中指定的是組件的類或者是組件的名稱。詳細(xì)的請參照component標(biāo)簽。要指定組件的類,只要是組件instanceof類的操作返回為true的類就能夠指定。但是、S2Container中所指定的類對應(yīng)了好幾個實裝的組件的時候,S2Container將不能判斷返回哪一個組件為好,這樣就會發(fā)生TooManyRegistrationRuntimeException。請指定實裝組件為唯一的類。也可以用組件名稱取得組件。這種情況下也是同樣,用一個
40、名稱的復(fù)數(shù)個組件被注冊的情況下,將發(fā)生TooManyRegistrationRuntimeException。指定組件名的場合下,因為也可能發(fā)生拼寫錯誤,所以盡可能的指定組件的類為好。例)通過指定類來取得組件的場合S2Containercontainer=S2ContainerFactory.create(PATH);Hogehoge=(Hoge)container.getComponent(Hoge.class);例)通過指定組件名來取得組件場合S2Containercontainer=S2ContainerFactory.create(PATH);Hogehoge=(Hoge)contai
41、ner.getComponent(hoge);DependencyInjection的類型在DependencyInjection中,組件的構(gòu)成所必要的值是用構(gòu)造函數(shù)來設(shè)定(ConstructorInjection),還是用設(shè)定函數(shù)來設(shè)定(SetterInjection),或者是用初始化函數(shù)來設(shè)定(MethodInjection),這樣進(jìn)行分類。MethodInjection是S2Container的本源。S2Container支持以上所有類型和混合類型。構(gòu)造函數(shù)?注入對構(gòu)造函數(shù)的參數(shù)進(jìn)行DI,這就是構(gòu)造函數(shù)注入。S2Container的定義文件中,記述如下內(nèi)容。組件的指定組件,用compon
42、ent標(biāo)簽來組建。用class指定對應(yīng)的類。也可以用name屬性給組件起名稱。構(gòu)造函數(shù)的參數(shù)的指定組件的構(gòu)造函數(shù)的參數(shù)用component標(biāo)簽的子標(biāo)簽arg標(biāo)簽來指定。值為字符串的時候,用雙引號(“)括起來。componentscomponentname=.class=.arg./arg/component/components設(shè)定函數(shù)?注入設(shè)定函數(shù)注入是指對于任意一個屬性變量使用設(shè)定函數(shù)來行使DI。S2Container的定義文件中作如下內(nèi)容的記述。組件的指定組件的指定同構(gòu)造函數(shù)注入相同。屬性變量的指定組件的屬性變量用component標(biāo)簽的子標(biāo)簽property來指定。用name屬性來指定
43、變量的名稱。componentscomponentname=.class=.propertyname=./property方法函數(shù)?注入方法函數(shù)注入是指,通過任意一個函數(shù)的調(diào)用來完成DI的功能。S2Container的定義文件中,記述如下內(nèi)容。組件的指定組件的指定同構(gòu)造函數(shù)注入相同。初始化方法函數(shù)的指定使用initMethod標(biāo)簽,調(diào)用組件的任意一個方法函數(shù)。在name屬性中,指定方法函數(shù)的名稱。用arg標(biāo)簽指定參數(shù),name屬性省略,在正文中,使用OGNL式也可以。componentscomponentname=class二initMethodname=arg/arg/initMethod/
44、component/componentsS2Container定義的分割和引入所有的組件用一個文件來設(shè)定的話,很快就會變得臃腫而難以管理。因此,S2Container就具有了將組件的定義進(jìn)行復(fù)數(shù)個分割的機(jī)能和將多個分割的定義文件引入而組織成一個文件的機(jī)能。S2Container定義文件的引入方法如下。componentsincludepath二bardicon/componentsinclude標(biāo)簽的path屬性被用來指定想要引入的S2Container定義文件的路徑。詳細(xì)情況請參照include標(biāo)簽。組件的檢索順序,先是在自身注冊的文件中尋找組件,沒有找到所需組件的情況下,將按照includ
45、e的順序在子定義文件中查找注冊到S2Container中的組件,最先找到的那個組件將被返回。命名空間組件的定義被分割的情況下,為了不讓復(fù)數(shù)個組件的定義名稱發(fā)生沖突,可以用components標(biāo)簽的namespace屬性指定命名空間。foo.diconargaaa/argbar.diconargaaa/argfoo.aaa/arg/component/componentsapp.diconcomponentsincludepath二bardicon/components在同一個組件定義文件中可以不需要指定命名空間而調(diào)用組件。調(diào)用其它S2Container文件中定義的組件時,要在組件名前加上命名空
46、間。foo.aaa和bar.aaa雖然有相同名稱的組件,但是因為命名空間的不同,就被認(rèn)為是不同的組件。實例(instance)管理在S2Container中,怎么樣對實例進(jìn)行管理,這個設(shè)定是用component標(biāo)簽的instance屬性。instance屬性singleton(default)prototyperequestsessionapplicationouter說明不論S2Container.getComponent()被調(diào)用多少次都返回同一個實例。S2Container.getComponent()每次被調(diào)用的時候都返回一個新的實例。對應(yīng)每一個請求(request)做成一個實例。用n
47、ame屬性中指定的名稱,組件被容納在請求中。使用request的場合下需要設(shè)定S2ContainerFilter。對應(yīng)每一個session做成一個實例。用name屬性中指定的名稱,組件被容納在session中。使用session的場合下需要設(shè)定S2ContainerFilter使用Servlet的場合下,對應(yīng)每一個ServletContext做成一個實例。用name屬性中指定的名稱,組件被容納在ServletContext中。使用application的場合下需要設(shè)定S2ContainerFilter。組件的實例在S2Container之外作成,從而僅僅行使DependencyInjectio
48、n的功能。Aspect、構(gòu)造函數(shù)注入不能適用。生存周期使用initMethod和destroyMethod組件的生存周期也可以用容器來管理。在S2Container的開始時用(S2Container.init()調(diào)用initMethod標(biāo)簽中指定的方法,S2Container結(jié)束時用(S2Container.destroy()調(diào)用destroyMethod標(biāo)簽中指定的方法。initMethod將按照容器中注冊的組件的順序來執(zhí)行組件,destroyMethod則按照相反的順序去執(zhí)行。instance屬性是singleton之外的情況下,指定了destroyMethod也會被忽視。java.uti
49、l.HashMap#put()方法中初始化(給aaa賦值為111)?結(jié)束處理(給aaa賦值為null)的設(shè)定,向下面那樣。argaaa/arg111argaaa/argnull自動綁定組件間的依存關(guān)系,類型是interface的場合時,將由容器來自動解決。這是在S2Container被默認(rèn)的,指定component標(biāo)簽的autoBinding屬性可以進(jìn)行更加細(xì)致的控制。auto(default)適用于構(gòu)造函數(shù)和屬性變量的自動綁定。constructor適用于構(gòu)造函數(shù)的自動綁定。property適用于屬性變量的自動綁定。none只能對構(gòu)造函數(shù)、屬性變量進(jìn)行手動綁定。構(gòu)造函數(shù)的自動綁定規(guī)則如下所示
50、。明確指定了構(gòu)造函數(shù)的參數(shù)的情況下,自動綁定將不再適用。不屬于上述情況,如果是定義了沒有參數(shù)的默認(rèn)的構(gòu)造函數(shù)的話,對于這個構(gòu)造函數(shù),自動綁定也不適用。不屬于上述情況,參數(shù)的類型全是interface并且參數(shù)數(shù)目最多的構(gòu)造函數(shù)將被使用。這樣,對于從容器中取得參數(shù)類型的實裝組件,自動綁定是適用的。如果不是以上情況,自動綁定將不適用。屬性變量的自動綁定規(guī)則如下。明確指定了屬性變量的情況下,自動綁定將不適用。不屬于上述情況,如果在容器的注冊組件中存在著可以代入屬性變量中的同名組件,自動綁定將適用于該組件。不屬于上述情況,屬性變量的類型是interface并且該屬性類型的實裝組件在容器中注冊了的話,自動
51、綁定是適用的。如果不是以上情況,自動綁定將不適用。用property標(biāo)簽的bindingType屬性,可以更加細(xì)致的控制屬性變量。bindingType說明must自動綁定不適用的情況下?將會發(fā)生例外。should(default)自動綁定不適用的情況下,將發(fā)出警告通知。may自動綁定不適用的情況下,什么都不發(fā)生。noneautoBinding的屬性雖然是auto、property情況下,自動綁定也不適用。在組件中利用S2Container不想讓組件依存于S2Container的情況下,根據(jù)組件的具體情況,在組件中需要調(diào)用S2Container的方法,這樣的場合也許會存在。S2Containe
52、r自身也以container的名稱,自我注冊了。所以可以在arg,property標(biāo)簽的正文中指定container,從而取得容器的實例。還有,S2Container類型的setter方法定義好了后也可以做自動綁定的設(shè)定。用arg,property標(biāo)簽指定container的情況下,向下面這樣進(jìn)行。componentscomponentclass二examplesdicon.BarImplargcontainer/arg/componentcontainer/propertyS2ContainerServlet到此為止,在Javaapplication中,是用明確表示的方法做成S2Contai
53、ner的,Webapplication的情況下,由誰來作成S2Container呢?為了達(dá)到這個目的,準(zhǔn)備了以下的類。orgseasarframework.containerservlet#S2ContainerServlet為了使用S2ContainerServlet,在web.xml中記述如下項目。servletservlet-names2servlet/servlet-nameservlet-classorg.seasar.framework.container.servlet.S2ContainerServlet/servlet-classinit-paramparam-namecon
54、figPath/param-nameparam-valueapp.dicon/param-value/init-paraminit-paramdebugfalse/init-param1/servletservlet-mappingservlet-names2servlet/servlet-nameurl-pattern/s2servlet/url-pattern/servlet-mapping用configPath來指定作為根的S2Container的定義路徑。定義文件將放在WEB-INF/classes中。對于S2ContainerServlet,為了比其它的servlet更早的起動,請做
55、load-on-startup標(biāo)簽的調(diào)整。S2ContainerServlet起動之后,可以用如下的方法函數(shù)取得S2Container的實例。org.seasar.framework.container.factory.SingletonS2ContainerFactory#getContainer()另外,S2Container的生命周期和S2ContainerServlet是連動的。debug變量被設(shè)為true的話,按照以下的方法,可以將運行中的S2Container再次起動。xxx是Webapplication的context名。 HYPERLINK http:/localhost:80
56、80/xxx/s2servlet?command=restart http:/localhost:8080/xxx/s2servlet?command=restart在使用了S2ContainerServlet的情況下,ServletContext將會作為一個組件可以用servletContext的名字來訪問。app.dicon的角色根的S2Container的定義文件,按照慣例用app.dicon的名稱。通常放在WEB-INF/classes中就好了。AOP的適用在組件中ADE的適用情況也可以被設(shè)定。比如,想要在ArrayList中設(shè)定Traceinterceptor使用的情況下需要象下面這
57、樣做。traceInterceptor/aspectarg0/argtraceInterceptor/aspectaspect標(biāo)簽的正文中指定Interceptor的名字。pointcut的屬性中可以用逗號做分隔符指定A0P對象的方法的名字。pointcut的屬性沒有被指定的情況下,組件將把實裝的interface的所有方法函數(shù)作為AOP的對象。方法函數(shù)的名稱指定也可以用正則表達(dá)式(JDK1.4。regex)。這樣的定義例子如下。privatestaticfinalStringPATH=examples/dicon/Aop.dicon;S2Containercontainer=S2Contai
58、nerFactory.create(PATH);Listlist=(List)container.getComponent(List.class);list.size();Datedate=(Date)container.getComponent(Date.class);date.getTime();date.hashCode();date.toString();執(zhí)行結(jié)果。BEGINjava.util.ArrayList#size()ENDjava.util.ArrayList#size():0BEGINjava.util.Date#getTime()ENDjava.util.Date#get
59、Time():0BEGINjava.util.Date#hashCode()BEGINjava.util.Date#getTime()ENDjava.util.Date#getTime():0ENDjava.util.Date#hashCode():0BEGINjava.util.Date#getTime()ENDjava.util.Date#getTime():0組件中也可以設(shè)定InterType的適用情況。比如,在Hoge中設(shè)定PropertyInterType的適用情況如下進(jìn)行。componentspertyInterType在interType標(biāo)簽的正文中指定InterType的名稱。
60、Meta數(shù)據(jù)在components、component、arg、property標(biāo)簽中也可以指定Meta數(shù)據(jù)。meta標(biāo)簽將作為需要指定Meta數(shù)據(jù)的標(biāo)簽的字標(biāo)簽來指定Meta數(shù)據(jù)。例如,想要在components標(biāo)簽中指定Meta數(shù)據(jù)的情況時,象下面一樣設(shè)定。componentsmetaname=aaalll/metarequest的自動綁定對于組件來說,也可以進(jìn)行HttpServletRequest的自動綁定。為了實現(xiàn)這個目的,在組件中,定義了setRequest(HttpServletRequestrequest)方法。這樣的話,S2Container就自動得設(shè)定了request。還有,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)綜合體智能技術(shù)應(yīng)用與運營效率考核試卷
- 水電合同范本2017
- 綠墻保養(yǎng)合同范本
- 按摩店轉(zhuǎn)讓合同范本
- 商超促銷員培訓(xùn)課件
- 承包木耳基地合同范本
- 業(yè)務(wù)代理服務(wù)協(xié)議條款及細(xì)則
- 創(chuàng)新醫(yī)療技術(shù)研發(fā)合同2024
- 私營店主用人勞動合同
- 男女朋友分手協(xié)議書
- 智能制造在食品加工業(yè)中的應(yīng)用與發(fā)展
- 化工公司原址污染場地污染土壤治理修復(fù)方案
- 法蘭標(biāo)準(zhǔn)尺寸表(美標(biāo)、日標(biāo)、德標(biāo))
- 施工技術(shù)管理項總體思路、方式和方法解析
- 《大學(xué)生安全教育》課件-第一課 國家安全
- 消防安全評估投標(biāo)方案
- 赤蒼藤扦插育苗技術(shù)規(guī)程
- 風(fēng)電場設(shè)備材料設(shè)備清單
- 城市交通與道路規(guī)劃講義第一章緒論
- 常用護(hù)理風(fēng)險評估量表
- Web前端技術(shù)PPT完整全套教學(xué)課件
評論
0/150
提交評論