




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 /30開源框架Seasar2在日本,Seasar2這個框架十分的流行。Seasar2其實就是類似于Spring的一個開源框架大家有興趣的話,可以去官方網站看看:/index-html中文版現在還沒完善,大家可能要用日文或則英文來了解下面簡單介紹一下:所謂“Seasar2”就是一個“輕量級容器”,面向無法擺脫“Java應用開發”之煩惱的所謂“開發者”,它能夠保證開發的“高生產率和高品質”。并且同“其它輕量級容器”不同的是,“完全不需要書寫設定文件”,“就算是應用程序發生改動也無需再次起動即可直接識別變更,因此具有腳本語言的靈活性”。為了不用寫設定文件也能夠運行,ConventionoverCo
2、nfiguration的思想得以采用。ConventionoverConfiguration就是指,“只要遵守一個適當的規約,即使不用進行非常麻煩的設定,框架結構也可以自動替我們搞定的思想”,這一思想是RubyonRails中所倡導的。Seasar2的ConventionoverConfiguration是從RubyonRails那里得到的提示而產生的。使用Seasar2的話,對于僅僅需要維護數據表這樣簡單的應用,可以在不到3分鐘的時間里作成。應用程序發生改動之時也無需啟動便可立即識別變更的機能在Seasar2里被稱為HOTdeploy。安裝:S2需要安裝JDK1.4orJDK1.5。將S2x
3、xx.zip解壓之后的seasar2目錄引入到Eclipse、文件導入既存的工程。使用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的擴張機能(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根據應用軟件所需的執行環境、選擇以下需要引用的文件geronimo-j2ee_1.4_specT.0.jar、geronimo-jta_1.0.1B_specT.0.jar、geronimo-ejb_2.1_specT.0.jar環境geronimo-j2ee1.4spec-1.0.jargeronimo-jta1.1spec-1.0.jargeronimo-ejb2.1spec-1.0.jar不完全對應J2EE的不要要要Servletcontainer(Tomcat等)(使用S2JTA,S2Tx的時候)(使用S2Tiger的時候)完全對應J2EE的應用
6、服務器(JBoss,WebSphere,WebLogic等)不要不要不要獨立要(使用S2JTA,S2Tx時候)不要不要為了讓大家更簡單的體驗數據庫機能、使用了HSQLDB作為RDBMS。為了能夠體驗Oracle機能、準備了hsql/sql/demo-oracle.sql。SQL*Plus等執行了之后、請根據環境的需要改寫jdbc.dicon的XADataSourcelmpI的設定項冃。請使用S2Container用的插件Kijimuna想使用EJB3anoteshon的情況下、將S2TigerXXX.zip解壓縮后的s2-tiger目錄引入Eclipse、文件導入既存的工程。在Seasar2的
7、設定基礎上、必需要將以下的文件追加到CLASSPATH里面。lib/s2-tiger-x.x.x.jarresources/jdbc.dicon想使用Tigeranoteshon的情況、將S2TigerXXX.zip解凍后的s2-tiger目錄引入Eclipse、文件進口既存的項目。在Seasar2的設定基礎上、必需要將以下的文件追加到CLASSPATH里面。lib/s2-tiger-x.x.x.jar快速上手S2Container,就是進行DependencyInjection(注:依賴注入譯者)(以后略稱為DI)的一個輕量級容器。DI,就是Interface和實裝分離,程序相互之間僅通過I
8、nterface來會話的一種思考方式。最初的一步讓我們趕快試一試吧。登場人物如下。問候語類o返回問候語的字符串。問候客戶端類o從問候類獲得問候語(字符串)并輸出到終端屏幕。問候語應用主類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)來實現問候的機能。packageexamplesdiimpl;importexamplesdiGreeting;im
10、portexamplesdiGreetingClient;publicclassGreetingClientImplimplementsGreetingClientprivateGreetinggreeting;publicvoidsetGreeting(Greetinggreeting)thisgreeting=greeting;publicvoidexecute()Systemoutprintln(greetinggreet();機能提供端和使用端的準備都完成了。下面我們就執行一下試試吧。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、行結果如下。HelloWorld!象這樣機能的使用者(GreetingClientImpl)經由Interface(Greeting)的中介來使用機能,具體的機能對象(既Interface的實裝類)在實行的時候由第三者(在這里是GreetingMain)來提供的情況,就是DI的基本思考方法。但是,如果象GreetingMain中那樣實裝類的設定內容直接被寫出來的話,一旦實裝類需要變更的時候源代碼也必須跟著修正。為了避免這個麻煩,DIContainer就登場了。把實裝設定抽出到一個設定文件中,由DIContainer把這個設定文件讀入并組織對象運行。那么,讓我們試著把剛才的提到的那個設定文件的內
13、容寫一下。S2Container中,設定文件的后綴是dicon。GreetingMain2.dicon!D0CTYPEcomponentsPUBLIC-/SEASAR/DTDS2Container2.3/ENhttp:/www.seasarorg/dtd/components23dtdcomponentscomponentname二greetingclass二examples.di.impl.GreetingImpl/greeting/property上文記載的是組件的定義。在這里,相當于如下的Java代碼。Greetinggreeting=newGreetingImpl();componen
14、t標簽的name屬性指定了組件的名稱,class屬性指定了組件的Java類文件名。下文就是greetingClient的設定。greetingproperty標簽的name屬性指定了組件Java類中的屬性名,標簽的定義體則指定了一個組件名稱。這個設定相當于如下Java代碼。組件名要注意不要用括起來。用括起來的話就會被當作字符串來處理了。GreetingClientlmplgreetingclient=newGreetingClientImpl();greetingClient.setGreeting(greeting);利用S2Container的起動類的內容如下。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)做成的。更加詳細的內容請參照S2Container的牛成組件(greetingClient),是由S2Container#getComponent(Stringcompo
17、nentName)的方法取得的。詳細內容請參照組件的取得實行結果同先前一樣表示如下。HelloWorld!經常同DI一起使用的是AOP。AOP是指、將日志等的輸出分散到復數個類中的邏輯模塊化的一種技術。那么、讓我們不修改已經作成的Greetinglmpl、GreetingClinetImpl的源代碼?試著將日志(追蹤)輸出。適用于AOP的設定文件如下。GreetingMain3.dicon!DOCTYPEcomponentsPUBLIC/SEASAR/DTDS2Container2.3/ENhttp:/wwwseasarorg/dtd/components23dtdaoptracelnterc
18、eptor/aspectpropertyname=greetinggreeting/propertyaspectaop.tracelnterceptor/aspect/component/componentsSeasar2中,經常使用的AOP模塊在aop.dicon中預先定義。象下面這樣、使用include標簽。更加詳細的?敬請參照S2Container定義的分解和引入。(includepath=aop.dicon/對于在組件中適用的AOP來說?我們component標簽的字標簽aspect標簽的正文中指定AOP的模塊名稱。aop.tracelnterceptor是AOP模塊的名字。aspec
19、taop.tracelnterceptor/aspectAOP的設定如上所述。那么就讓我們執行一下GreetingMain3吧。同GreetingMain2不同的僅僅是設定文件的路徑而已。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();執行結果如下。可以明白一點,沒有修改源代碼,日志就被輸出了。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的基本使用方法就被掌握了。更進一步但是,不管怎么說書寫設定文件都是一件麻煩的事啊。在S2Container中,為了盡可能的減少設定文件的記述量、采用了如下的概念。ConventionoverConfiguration就是說制定一個適當的規約,遵守這個規約的話?無需什么設定也可以運作。比如說,剛才的設定文件中,象下面這樣明確地指定屬性的部分存在著。componentname=greetingClientclass=examples.di.impl.GreetingClientImplpropertyname=g
23、reetinggreeting/property/componentS2Container中、屬性的類型是Interface的情形下?如果要將屬性類型的實裝組件注冊進軟件容器中,不需要什么特殊的設定也可以自動得運作DI的機能。這就是,如果遵守DI中推薦的所謂“屬性類型用Interface定義的規則,S2Container會自動地處理一切。雖然一說到規約就容易產生麻煩之類的想法,“推薦而已,如果遵守的話就能使開發愉快”的話,遵守規約的動機就產生了。這才是問題的重點。如上的設定,可以做如下化簡(componentname=greetingClientclass=examples.di.impl.G
24、reetingClientImpl/component實際上?剛才的AOP的例子也適用“ConventionoverConfiguration”。通常在AOP中,AOP的模塊在什么地方適用是由pointcut指定的,S2AOP的情況下?如果遵守所謂“使用Interface”這個推薦的規約,不指定pointcut,自動的適用于在Interface中定義的所有方法。因為有這個機能,在剛才的那個例子中,就沒有必要指定pointcut。雖然根據“ConventionoverConfiguration”,DI和AOP的設定可以得以簡化,需要處理的組件數增加了、僅僅組件的注冊也會變成一個非常累的作業。那么
25、這個組件注冊自動化就叫做組件自動注冊機能。剛才的GreetingImpl、GreetingClientImpl的注冊自動化如下。(componentclass=org.seasar.framework.container.autoregister.FileSystemComponentAutoRegisterinitMethodname=addClassPatternargexamples.di.impl/argarg.*Impl/arg/initMethodFileSystemComponentAutoRegister組件將addClassPattern方法指定的類從文件系統中探尋出來,自動
26、注冊到S2Container中。關于initMethod標簽,請參照方法函數注入。addClassPattern方法的第一個參數是想要注冊的組件的包的名字。子包的內容也會用回歸的方式檢索。第二個參數是類的名字。可以使用正則表達式。也可以用“,”做分隔符指定復數個設定。根據組件自動注冊原則,即使后續追加組件的情況下,也沒有必要追加設定,這樣手續就大大地簡化了。如果組件的自動化注冊可以了,接下來就會想讓AOP的注冊也自動化了吧。剛才的GreetingImpl、GreetingClientImp的AOP注冊自動化的設定如下。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那么來執行一下GreetingMai
29、n4吧。自動注冊的情況下,S2Container#init()和S2Container#destroy()的調用是必要的。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();執行的結果同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大多數的情況下?自動注冊和自動綁定的組合方式都能順利的進行下去。不想要自動注冊的組件存在的情況下,自動注冊組件中準備了addlgnoreClassPattern方法,可以指定自動注冊外的組件。不想要自動綁定的屬性存在的情況下,使用Binding備注碼,不使用設定文件也可以做細節的調整。使用Hotswap的話?應用程序在運行中重新書寫更換類文件,馬上就能夠直接測試結果。不需要一個一個地將應用程序在啟動,因此開發的效率能夠得到大幅度的提高。現在,關于S2Container的高級使用方法也可以掌握了。這之后嘛,只要根據需要參照對應的操作手冊就可以了。S
33、2Container參考需要作成的文件為了使用S2Container,定義文件的做成是必要的。定義文件就像是為了組織組件而制作的設計書一樣的東西。形式為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標簽。每一個組件用component標簽定義。用component標簽的class屬性指定組件的類的全名。在name屬性中、指定組件的名稱。詳細內容請參照S2Container定義標簽參考。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();定義文件的路徑需要被指定的情況下應在調用init()之前執行如下方法。-org.seasar.framework.container.factory.SingletonS2ContainerFactory#setConfigPath(StringPath)參數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();用這個方法取得的組件的實例,有必要進行在應用中的管理。組件的取得從S2Container中將組件取出來,使用下面的方
39、法。一org.seasar.framework.container.S2Container#getComponent(0bjectcomponentKey)參數中指定的是組件的類或者是組件的名稱。詳細的請參照component標簽。要指定組件的類,只要是組件instanceof類的操作返回為true的類就能夠指定。但是、S2Container中所指定的類對應了好幾個實裝的組件的時候,S2Container將不能判斷返回哪一個組件為好,這樣就會發生TooManyRegistrationRuntimeException。請指定實裝組件為唯一的類。也可以用組件名稱取得組件。這種情況下也是同樣,用一個
40、名稱的復數個組件被注冊的情況下,將發生TooManyRegistrationRuntimeException。指定組件名的場合下,因為也可能發生拼寫錯誤,所以盡可能的指定組件的類為好。例)通過指定類來取得組件的場合S2Containercontainer=S2ContainerFactory.create(PATH);Hogehoge=(Hoge)container.getComponent(Hoge.class);例)通過指定組件名來取得組件場合S2Containercontainer=S2ContainerFactory.create(PATH);Hogehoge=(Hoge)contai
41、ner.getComponent(hoge);DependencyInjection的類型在DependencyInjection中,組件的構成所必要的值是用構造函數來設定(ConstructorInjection),還是用設定函數來設定(SetterInjection),或者是用初始化函數來設定(MethodInjection),這樣進行分類。MethodInjection是S2Container的本源。S2Container支持以上所有類型和混合類型。構造函數?注入對構造函數的參數進行DI,這就是構造函數注入。S2Container的定義文件中,記述如下內容。組件的指定組件,用compon
42、ent標簽來組建。用class指定對應的類。也可以用name屬性給組件起名稱。構造函數的參數的指定組件的構造函數的參數用component標簽的子標簽arg標簽來指定。值為字符串的時候,用雙引號(“)括起來。componentscomponentname=.class=.arg./arg/component/components設定函數?注入設定函數注入是指對于任意一個屬性變量使用設定函數來行使DI。S2Container的定義文件中作如下內容的記述。組件的指定組件的指定同構造函數注入相同。屬性變量的指定組件的屬性變量用component標簽的子標簽property來指定。用name屬性來指定
43、變量的名稱。componentscomponentname=.class=.propertyname=./property方法函數?注入方法函數注入是指,通過任意一個函數的調用來完成DI的功能。S2Container的定義文件中,記述如下內容。組件的指定組件的指定同構造函數注入相同。初始化方法函數的指定使用initMethod標簽,調用組件的任意一個方法函數。在name屬性中,指定方法函數的名稱。用arg標簽指定參數,name屬性省略,在正文中,使用OGNL式也可以。componentscomponentname=class二initMethodname=arg/arg/initMethod/
44、component/componentsS2Container定義的分割和引入所有的組件用一個文件來設定的話,很快就會變得臃腫而難以管理。因此,S2Container就具有了將組件的定義進行復數個分割的機能和將多個分割的定義文件引入而組織成一個文件的機能。S2Container定義文件的引入方法如下。componentsincludepath二bardicon/componentsinclude標簽的path屬性被用來指定想要引入的S2Container定義文件的路徑。詳細情況請參照include標簽。組件的檢索順序,先是在自身注冊的文件中尋找組件,沒有找到所需組件的情況下,將按照includ
45、e的順序在子定義文件中查找注冊到S2Container中的組件,最先找到的那個組件將被返回。命名空間組件的定義被分割的情況下,為了不讓復數個組件的定義名稱發生沖突,可以用components標簽的namespace屬性指定命名空間。foo.diconargaaa/argbar.diconargaaa/argfoo.aaa/arg/component/componentsapp.diconcomponentsincludepath二bardicon/components在同一個組件定義文件中可以不需要指定命名空間而調用組件。調用其它S2Container文件中定義的組件時,要在組件名前加上命名空
46、間。foo.aaa和bar.aaa雖然有相同名稱的組件,但是因為命名空間的不同,就被認為是不同的組件。實例(instance)管理在S2Container中,怎么樣對實例進行管理,這個設定是用component標簽的instance屬性。instance屬性singleton(default)prototyperequestsessionapplicationouter說明不論S2Container.getComponent()被調用多少次都返回同一個實例。S2Container.getComponent()每次被調用的時候都返回一個新的實例。對應每一個請求(request)做成一個實例。用n
47、ame屬性中指定的名稱,組件被容納在請求中。使用request的場合下需要設定S2ContainerFilter。對應每一個session做成一個實例。用name屬性中指定的名稱,組件被容納在session中。使用session的場合下需要設定S2ContainerFilter使用Servlet的場合下,對應每一個ServletContext做成一個實例。用name屬性中指定的名稱,組件被容納在ServletContext中。使用application的場合下需要設定S2ContainerFilter。組件的實例在S2Container之外作成,從而僅僅行使DependencyInjectio
48、n的功能。Aspect、構造函數注入不能適用。生存周期使用initMethod和destroyMethod組件的生存周期也可以用容器來管理。在S2Container的開始時用(S2Container.init()調用initMethod標簽中指定的方法,S2Container結束時用(S2Container.destroy()調用destroyMethod標簽中指定的方法。initMethod將按照容器中注冊的組件的順序來執行組件,destroyMethod則按照相反的順序去執行。instance屬性是singleton之外的情況下,指定了destroyMethod也會被忽視。java.uti
49、l.HashMap#put()方法中初始化(給aaa賦值為111)?結束處理(給aaa賦值為null)的設定,向下面那樣。argaaa/arg111argaaa/argnull自動綁定組件間的依存關系,類型是interface的場合時,將由容器來自動解決。這是在S2Container被默認的,指定component標簽的autoBinding屬性可以進行更加細致的控制。auto(default)適用于構造函數和屬性變量的自動綁定。constructor適用于構造函數的自動綁定。property適用于屬性變量的自動綁定。none只能對構造函數、屬性變量進行手動綁定。構造函數的自動綁定規則如下所示
50、。明確指定了構造函數的參數的情況下,自動綁定將不再適用。不屬于上述情況,如果是定義了沒有參數的默認的構造函數的話,對于這個構造函數,自動綁定也不適用。不屬于上述情況,參數的類型全是interface并且參數數目最多的構造函數將被使用。這樣,對于從容器中取得參數類型的實裝組件,自動綁定是適用的。如果不是以上情況,自動綁定將不適用。屬性變量的自動綁定規則如下。明確指定了屬性變量的情況下,自動綁定將不適用。不屬于上述情況,如果在容器的注冊組件中存在著可以代入屬性變量中的同名組件,自動綁定將適用于該組件。不屬于上述情況,屬性變量的類型是interface并且該屬性類型的實裝組件在容器中注冊了的話,自動
51、綁定是適用的。如果不是以上情況,自動綁定將不適用。用property標簽的bindingType屬性,可以更加細致的控制屬性變量。bindingType說明must自動綁定不適用的情況下?將會發生例外。should(default)自動綁定不適用的情況下,將發出警告通知。may自動綁定不適用的情況下,什么都不發生。noneautoBinding的屬性雖然是auto、property情況下,自動綁定也不適用。在組件中利用S2Container不想讓組件依存于S2Container的情況下,根據組件的具體情況,在組件中需要調用S2Container的方法,這樣的場合也許會存在。S2Containe
52、r自身也以container的名稱,自我注冊了。所以可以在arg,property標簽的正文中指定container,從而取得容器的實例。還有,S2Container類型的setter方法定義好了后也可以做自動綁定的設定。用arg,property標簽指定container的情況下,向下面這樣進行。componentscomponentclass二examplesdicon.BarImplargcontainer/arg/componentcontainer/propertyS2ContainerServlet到此為止,在Javaapplication中,是用明確表示的方法做成S2Contai
53、ner的,Webapplication的情況下,由誰來作成S2Container呢?為了達到這個目的,準備了以下的類。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標簽的調整。S2ContainerServlet起動之后,可以用如下的方法函數取得S2Container的實例。org.seasar.framework.container.factory.SingletonS2ContainerFactory#getContainer()另外,S2Container的生命周期和S2ContainerServlet是連動的。debug變量被設為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的適用情況也可以被設定。比如,想要在ArrayList中設定Traceinterceptor使用的情況下需要象下面這
57、樣做。traceInterceptor/aspectarg0/argtraceInterceptor/aspectaspect標簽的正文中指定Interceptor的名字。pointcut的屬性中可以用逗號做分隔符指定A0P對象的方法的名字。pointcut的屬性沒有被指定的情況下,組件將把實裝的interface的所有方法函數作為AOP的對象。方法函數的名稱指定也可以用正則表達式(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();執行結果。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組件中也可以設定InterType的適用情況。比如,在Hoge中設定PropertyInterType的適用情況如下進行。componentspertyInterType在interType標簽的正文中指定InterType的名稱。
60、Meta數據在components、component、arg、property標簽中也可以指定Meta數據。meta標簽將作為需要指定Meta數據的標簽的字標簽來指定Meta數據。例如,想要在components標簽中指定Meta數據的情況時,象下面一樣設定。componentsmetaname=aaalll/metarequest的自動綁定對于組件來說,也可以進行HttpServletRequest的自動綁定。為了實現這個目的,在組件中,定義了setRequest(HttpServletRequestrequest)方法。這樣的話,S2Container就自動得設定了request。還有,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 稿定設計制作與編輯指南
- 特色農業林業品種繁育合作合同
- 政治與社會2025年公共關系學試題及答案
- 高效學習水利水電工程考試試題及答案
- 工程經濟投資風險緩解試題及答案
- 財務部門在戰略規劃中的角色計劃
- 合同范本體育賽事居間合同
- 食堂用餐服務投訴處理協議
- 2025年定制化工程項目管理試題及答案
- 老年勞動力返聘協議
- 常見病媒生物分類鑒定
- 畢業論文-原油電脫水方法與機理的研究
- 陜西省2022年普通高中學業水平考試(真題)
- DBJ∕T13-374-2021 福建省鋼筋桁架疊合樓板技術標準
- 事故池管理的有關規定
- 2021-2022學年甘肅省天水市第一中學高一下學期第二階段考物理試題(原卷版)
- 重慶市參加企業職工基本養老保險人員退休審批表
- 混凝土結構課程設計244
- GE全球供應鏈的管理與實踐
- 跨國道防護棚方案
- 挖掘機入場驗收表(共1頁)
評論
0/150
提交評論