




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
外文原文CHAPTER2ARCHITECTUREINTHEORYTHEREISNODIFFERENCEBETWEENTHEORYANDPRACTICEBUT,INPRACTICE,THEREISJANLAVANDESNEPSCHEUTARCHITECTUREITSTHATLEVELABOVEDESIGNWHEREWEGETOURFIRSTGLIMPSEOFWHATTHESYSTEMWILLULTIMATELYRESEMBLE,HOWITWILLBEBUILT,THEVISIONOFTHEAPPLICATIONANDSYSTEMASAWHOLEBYKEEPINGTHEADVICECONTAINEDINTHEITEMSTHATFOLLOWINMINDWHENLAYINGOUTTHEBASICFLOWANDDESIGNOFYOURENTERPRISEAPPLICATIONSANDSYSTEMS,YOULLMAKEPROGRESSTOWARDANOBLEGOALESTABLISHINGANARCHITECTURETHATENABLESAHIGHPERFORMANCE,HIGHSCALABILITYENTERPRISESYSTEMITEM1PREFERCOMPONENTSASTHEKEYELEMENTOFDEVELOPMENT,DEPLOYMENT,ANDREUSEONEOFTHEDIFFICULTIESMANYJAVADEVELOPERSFACEWHENATTEMPTINGTHEIRFIRSTJ2EEBASEDPROJECTISTHATJ2EEAPPLICATIONSAREBUILTDIFFERENTLYTHANTRADITIONALJAVAAPPLICATIONSRATHERTHANBUILDINGAPPLICATIONS,J2EEMANDATESTHECONSTRUCTIONOFCOMPONENTSTHATPLUGINTOANALREADYEXISTINGAPPLICATION,THATBEINGTHEJ2EECONTAINERITSELFTHISMAYNOTSEEMLIKEALARGEDIFFERENCEATFIRST,BUTITSIMPLICATIONSAREHUGE,INTWODIFFERENTDIRECTIONSFIRSTOFALL,THISMEANSTHATDEVELOPERSARENTREALLYINTERESTEDINCONSTRUCTINGOBJECTSPERSEBUTINCREATINGSTRONGLYENCAPSULATEDCOMPONENTSTHATINTHECASEOFJ2EEAREMADEUPOFTIGHTLYCOUPLEDCONSTITUENTOBJECTSSECOND,ITMEANSTHATTHEREAREASETOFSTRINGENTRULESTHATMUSTBEOBEYEDOVERWHICHWE,ASTHECOMPONENTBUILDER,HAVELITTLETONOINFLUENCEDEVELOPERSSTUDYINGTHEOBJECTORIENTEDPARADIGMHAVE,SINCETHEVERYEARLYDAYS,BEENREPEATEDLYTAUGHTTOPROMOTEENCAPSULATIONANDDATAHIDINGWEVEALLMEMORIZEDNUGGETSOFWISDOMHANDEDDOWNFROMONHIGH,SUCHAS“NEVERUSEPUBLICFIELDSINSTEADALWAYSCREATEACCESSORANDMUTATORMETHODSGETTERSANDSETTERS,INJAVABEANSLINGO,“FOREXAMPLE,OR“HIDEYOURIMPLEMENTATIONFROMCLIENTVIEW,“ANDSOONASARESULT,FOREVERYCLASSEVERWRITTEN,WEFAITHFULLYCREATEGET/SETMETHODPAIRSFOREVERYPRIVATEDATAFIELD,CREATEADEFAULTCONSTRUCTOR,ANDSOONUNFORTUNATELY,THISISHARDLYWHATTHEORIGINALPROPONENTSOFOBJECTORIENTATIONHADINMINDMERELYFORCINGCLIENTSTOGOTHROUGHAGETMETHODTOGETAREFERENCETOSOMEINTERNALLYHELDDATASTRUCTUREDOESNTCREATEENCAPSULATIONTHISHASLONGBEENDOCUMENTEDINSUCHBOOKSASEFFECTIVECMEYERS95AND,MORERECENTLY,EFFECTIVEJAVABLOCH,ITEM24MOREIMPORTANTLY,ITUNFORTUNATELYLEADSDEVELOPERSTOTHINKATASCALETOOSMALLFOREFFECTIVEREUSE,THATOFOBJECTSANDCLASSES,RATHERTHANTHINKINGATALARGERSCALE,SUCHASWHATWASORIGINALLYINTENDEDBYTHEJAVABEANSSPECIFICATIONNOTCONVINCEDCONSIDERATRADITIONALCOLLECTIONCLASS,SAY,ANARRAYLISTWECANUSETHEARRAYLISTASANINDEPENDENTOBJECT,BUTWHENITCOMESTIMETOWALKOVERTHECONTENTSOFTHECOLLECTIONITSELF,ANOTHEROBJECT,ANITERATORIMPLEMENTINGOBJECT,BECOMESDESIRABLE,IFNOTOUTRIGHTNECESSARYTHINKINGABOUTREUSEATTHECLASS/OBJECTLEVELMEANSWESERIOUSLYCONSIDERREUSINGTHEITERATORIMPLEMENTINGCLASSINDEPENDENTLYOFTHEARRAYLISTITSBOUNDTO,WHICHMAKESNOSENSEINSTEAD,BECAUSETHETWOAREINTENDEDTOBEUSEDASAPAIR,ITMEANSTHATWERELOOKINGATREUSEATAHIGHERLEVEL,WHATWEREFERTOASACOMPONENTINPRACTICALTERMS,THISUSUALLYMEANSASTANDALONEJARFILETHATCONTAINS,INTHISCASE,THEPAIROFCLASSESFORARRAYLISTANDITSINTERNALITERATORSUBTYPEINTHECOLLECTIONSCASE,ITWOULDALSOINCLUDERELEVANTINTERFACESLIKEITERATOR,COLLECTION,ANDLISTBECAUSETHEYALLHELPDEFINETHECONTRACTCLIENTSCANPLACEFAITHINTHISGETSUSINTOADISCUSSIONOFCOUPLINGTHEDEFINITIONOFTIGHTCOUPLINGSTATESTHATAGIVEN“THING“ISTIGHTLYCOUPLEDTOANOTHER“THING“IFONEHASTOCHANGEINRESPONSETOCHANGESINTHEOTHERINOTHERWORDS,CONSIDERARRAYLISTIFICHANGETHEDEFINITIONOFTHECOLLECTIONINTERFACE,WILLARRAYLISTNEEDTOCHANGEABSOLUTELY,SINCEITIMPLEMENTSCOLLECTIONTHROUGHLISTIFICHANGEARRAYLISTSINTERNALIMPLEMENTATION,WILLITSINTERNALITERATORIMPLEMENTATIONNEEDTOCHANGEABSOLUTELYHOWEVER,WILLCLIENTSNEEDTOCHANGENOTSOLONGASTHEYTREATTHEITERATORASAGENERALPURPOSEITERATORANDDONTDOWNCASTARRAYLISTISTIGHTLYCOUPLEDTOITSINTERNALITERATOR,ANDVICEVERSA,BUTCLIENTSCANREMAINLOOSELYCOUPLEDBYSTICKINGTOTHEINTERFACESLOOSECOUPLINGISEXPLAINEDINGREATERDETAILINITEM2,BUTINEEDTOFORWARDREFERENCEITHEREDONTSEETHERELEVANCERUNONOVERTOTHESERVLETBASEDWEBAPPLICATIONSIFWEOBEYTHETRADITIONALMODELVIEWCONTROLLERABSTRACTION,1THENWEREBUILDINGAMINIMUMOFTWOCLASSESTHATAREMOREORLESSTIGHTLYCOUPLEDTOONEANOTHERTHECONTROLLERSERVLETTHATDOESTHEINPUTPROCESSINGONANINCOMINGHTTPREQUEST,ANDTHEVIEWJSPTHATITFORWARDSTOTHECONTROLLERNEEDSTOKNOWWHATDATAELEMENTSTHEVIEWDEPENDSON,THEVIEWNEEDSTOKNOWWHATPROCESSINGHASALREADYBEENDONEBYTHECONTROLLERSOASNOTTODUPLICATETHATWORK,ANDTHETWOHAVETOAGREEONTHENAMESUNDERWHICHTHEDATAELEMENTSTHEVIEWDEPENDSONWILLBEBOUNDTHENAMEVALUEATTRIBUTESOFHTTPSESSIONPROVIDELATEBINDINGBUTNOTLOOSECOUPLINGAGAIN,SEEITEM2FORMOREINADDITION,BOTHCONTROLLERANDVIEWARETHEMSELVESTIGHTLYCOUPLEDAGAINSTTHEMODELCLASSES,SINCETHEYWILLNEEDTOKNOWWHATDATAELEMENTSAREPRESENTASPARTOFTHEMODELSUSEDASKYOURSELFTHESEQUESTIONSISITREALLYFEASIBLETOCONSIDERREUSINGTHECONTROLLERWITHOUTTHECORRESPONDINGVIEWAND/ORMODELCLASSESCOULDTHEVIEWEXECUTESUCCESSFULLYWITHOUTGOINGTHROUGHTHECONTROLLERSERVLETFIRST1THISISACTUALLYAMISNOMERTHEAPPROPRIATEPATTERNINQUESTIONISREALLYTHEPRESENTATIONABSTRACTIONCONTROLLERPOSA1,145,SINCETHEMODELVIEWCONTROLLERDEALSWITHMULTIPLEVIEWSANDTHEIRUPDATESIMULTANEOUSLY,SUCHASISCOMMONLYFOUNDINAGUIAPPLICATIONLIKEEXCELORWORDBECAUSETHEANSWERTOTHISQUESTIONISALMOSTUNIVERSALLY“NO,“ITMEANSTHATYOURCLASSESWITHINAGIVENCOMPONENT,INTHISCASEYOURPRESENTATIONLAYERCOMPONENT,AREIMPLICITLYTIGHTLYCOUPLEDTOONEANOTHERTHATINTURNYIELDSAREALIZATIONWHERETIGHTCOUPLINGALREADYEXISTS,WECANENJOYACERTAINAMOUNTOFRELAXATIONOFTHETRADITIONAL“ENCAPSULATEEVERYTHING“RULETHATWEOBEYSOMINDLESSLYIMNOTSUGGESTINGTHATYOUIMMEDIATELYRUNOUTANDREMOVEALLYOURGET/SETMETHODSINFAVOROFDIRECTFIELDACCESS,BUTIRECOMMENDTHATYOUTHINKLONGANDHARDABOUTWHATYOUREREALLYPROTECTINGAGAINSTFOREXAMPLE,IFYOURMODELOBJECTSARENTUSEDOUTSIDEOFTHEPRESENTATIONLAYERNOTETHETERMINOLOGYSEEITEM3ITSELF,DOESITREALLYMAKESENSETOPUTGET/SETMETHODSINFRONTOFEACHFIELD,PARTICULARLYWHERETHEMODELOBJECTSAREJUSTTHINWRAPPERSOVERACOLLECTIONOFDATA,ASWITHDATATRANSFEROBJECTSFOWLER,401REMEMBERTHATENCAPSULATIONWASDESIGNEDTOPROTECTCLIENTSAGAINSTIMPLEMENTATIONCHANGES,NOTTHECOMPONENTAGAINSTCHANGESWITHINITSELFFEWDEVELOPERSEVERSAWBENEFITSINTRYINGTOENCAPSULATEACLASSAGAINSTITSELFTHINKOFTHECOMPONENTASALARGER,MORECOARSEGRAINEDCLASS,ANDYOURENOTTOOFAROFFTHEMARKGIVENTHATWEHAVECLASSESTHATTIGHTLYCOOPERATEWITHONEANOTHERTOACHIEVESOMEUSEFULWORK,ANDTHATTHOSECLASSESNEEDTOBEDEPLOYEDTOGETHERATOMICALLYORELSENOTATALL,WERELOOKINGFORSOMETHING“LARGERTHANOBJECTS“ASTHEPRINCIPALUNITOFDEPLOYMENTINOTHERWORDS,WERELOOKINGFORCOMPONENTSTHESERVLETSPECIFICATIONHASMOVEDAWAYFROMTHEIDEAOFSTANDALONESERVLETSBEINGDEPLOYEDINDIVIDUALLYINTOTHESERVLETCONTAINERANDINSTEADEMBRACESTHEIDEAOFAWEBAPPLICATION,ACOLLECTIONOFRESOURCESLIKESERVLETS,JSPS,MODELCLASSES,UTILITYLIBRARIES,ANDSTATICRESOURCESLIKEHTML,IMAGES,AUDIOFILES,ANDSOONTHATCOLLECTIVELYWORKTOGETHERTOPROVIDEDESIREDFUNCTIONALITYTHEWEBAPPLICATIONISDEPLOYEDCOLLECTIVELYUNDERASINGLEWARFILE,SOTHATTHEREISNOPOSSIBLEWAYFORAONLYPARTOFTHEAPPLICATIONTOBEDEPLOYED,ORBTHEAPPLICATIONTOBEVERSIONMISMATCHEDBETWEENITSCOLLECTIVEPARTSINESSENCE,THEWARFILESERVESTHESAMEPURPOSETHATTHEJAVAJARFILEDIDINMAKINGJAVAAPPLICATIONDEPLOYMENTSEASIERIFYOUDIDJAVAINTHE10DAYS,YOULLREMEMBERTHE“UNZIPTHECLASSESONTOYOURCLASSPATH“STYLEOFDEPLOYMENTANDAGREETHATTRYINGTODEPLOYJAVAAPPLICATIONSINTHOSEDAYSWASLESSTHANELEGANTINSTEAD,THEATOMICDEPLOYMENTPROVIDEDBYTHEWARFILEMEANSTHATONLYTHOSERESOURCESTHATARESUPPOSEDTOBEPARTOFTHEWEBAPPLICATIONACTUALLYSHOWUPINTHEDEPLOYEDAPPLICATIONTHATIS,UNLESSYOUDELIBERATELYSCREWTHATUPBYDOINGPARTIALFILEBASEDDEPLOYMENTSBYCOPYINGINDIVIDUALFILESOVERINTOTHEDEPLOYEDAPPLICATIONDIRECTORYTHERESACOUPLEOFREASONSWHYTHISISABADIDEA,NOTTHELEASTOFWHICHISTHEPOSSIBILITYOFINTRODUCINGVERSIONMISMATCHESWHILEITMAYSEEMTEMPTINGTO“ONLYCOPYTHESTUFFTHATCHANGED“INTOTHEDEPLOYMENTDIRECTORY,ITSTOOEASYFORHUMANSTOLOSETRACKOFEXACTLYWHATHASCHANGEDAND,MOREIMPORTANTLY,TOFORGETTHATTHESERVLETCONTAINERDOESNTNECESSARILYTAKETHESAMEVIEWOFWHATHASCHANGEDASWEDOENTERTHECLASSLOADERREMEMBERHIMHESESTABLISHEDBYTHESERVLETCONTAINERTOLOADYOURWEBAPPLICATIONFROMDISKINTOTHEJVMTHESERVLETCONTAINERISREQUIREDTOSTARTANEWCLASSLOADEREACHTIMETHEWEBAPPLICATION“CHANGES,“WHICHUSUALLYMEANS“CHANGESONDISKINTHEDEPLOYMENTDIRECTORY“BUTIFYOUREADTHESERVLETSPECIFICATIONCAREFULLY,YOULLNOTICETHATWHENANEWCLASSLOADERISSTARTED,ITSESTABLISHEDOVERTHEENTIREWEBAPPLICATION,NOTANINDIVIDUALSERVLETITDOESTHISSOTHATEACHOFTHOSECLASSESTHATFORMTHEWEBAPPLICATIONAREALLLOADEDBYTHESAMECLASSLOADER,SINCETHECONTAINERSEESTHESEASASINGLECOMPONENTSOITSENTIRELYCONCEIVABLETHATEACHFILECOPIEDINTOTHEDEPLOYMENTDIRECTORYWILLYIELDANEWCLASSLOADERINSTANCE,CREATINGAWHOLETONOFEXTRAWORKFORTHECONTAINERANDYIELDINGNOTANGIBLEBENEFITBYTHEWAY,MAKESUREYOUUNDERSTANDWHATTANGIBLEEFFECTSTHISCLASSLOADINGPOLICYWILLYIELDTOYOUDIRECTLYBYREADINGITEM70THEPOINTOFALLTHISISTHATTHESERVLETANDOTHERJ2EESPECIFICATIONSEXPECTYOUTOBUILDWEBAPPLICATIONSTHATCOMBINETOFORMCOMPONENTS,NOTINDIVIDUALCLASSESTHEJSPSPECIFICATIONGOESONESTEPFURTHERITPROMOTESTHECONSTRUCTIONANDUSEOFSMALLERCOMPONENTSWITHINANDACROSSWEBAPPLICATIONSBYFOSTERINGTHECONCEPTOFREUSABLETAGLIBRARIESTHESPECIFICATIONSCOULDCARELESSWHATOBJECTSYOUCREATEANDUSE,SOLONGASTHOSEOBJECTSTHATAREHANDEDBACKTOTHECONTAINERITSELFOBEYCERTAINCONTRACTS,ASCONVEYEDVIAINTERFACES,ANDCERTAINOUTOFBANDRESTRICTIONSDESCRIBEDINTHESPECIFICATIONITSELFITSMORETHANJUSTIMPLEMENTINGEXISTINGINTERFACES,HOWEVERPARTOFBEINGACOMPONENTMEANSTHATBECAUSEYOUDIDNTWRITEMAIN,YOUDONTNECESSARILYKNOWTHEENVIRONMENTINWHICHYOURCODEISBEINGEXECUTEDONECLASSICMISTAKETHATBITESSERVLETDEVELOPERSTHEWORLDOVERASTHEYMOVEFROMONESERVLETCONTAINERTOTHENEXTISTHESIMPLEASSUMPTIONREGARDING“THECURRENTDIRECTORY“FORSOMESERVLETCONTAINERS,ITSTHEDIRECTORYINWHICHTHECONTAINERSEXECUTABLEFILESARELOCATEDTOMCAT/BIN,FOREXAMPLEFOROTHERCONTAINERS,HOWEVER,THEYSETA“WORK“DIRECTORYINWHICHBITSANDPIECESOFTHEWEBAPPLICATIONAREASSEMBLEDANDCALLEDTHENETRESULTISTHATIFYOUTRYTOLOADATEXTFILEFROMYOURWEBAPPLICATIONSDEPLOYMENTDIRECTORYBYCREATINGAFILEINPUTSTREAMWITHANARGUMENTOF/WEBAPPS/MYAPP/DATAXML,WHATWORKSONONESYSTEMWILLHORRIBLYBREAKONANOTHERFORTHISREASON,THESERVLETSPECIFICATIONSUGGESTSUSINGEITHERTHESERVLETCONTEXTGETRESOURCEORSERVLETCONTEXTGETRESOURCEASSTREAMMETHODS,BOTHOFWHICHAREALSOAVAILABLEONTHECLASSLOADERFORTHEWEBAPPLICATIONINFACT,THISCONCEPTOF“CONTEXT“TAKESONANIMPORTANTMEANINGINCOMPONENTBASEDENVIRONMENTSTHECONTEXT,SUCHASTHESERVLETCONTEXTINSERVLETAPPLICATIONS,ORTHEENTERPRISEBEANCONTEXTSESSIONCONTEXT,ENTITYCONTEXT,ORMESSAGEDRIVENCONTEXTINEJB,ISTHECOMPONENTSOFFICIAL“WINDOWTOTHEOUTSIDEWORLD,“ANDANYANDALLACCESSTOTHATOUTSIDEWORLDSHOULDTAKEPLACETHROUGHTHECONTEXTTHISGIVESTHECONTAINERTHEOPPORTUNITYTOINTERCEPTANDREDIRECTAPPLICATIONREQUESTSTOTHEAPPROPRIATEPLACE,IFTHECONTAINERISDOINGSOMETHINGTRICKYUNDERTHEHOODHIDDENFROMTHECODESVIEWFOREXAMPLE,WHENYOUWANTTODOAFORWARDFROMASERVLETTOAJSP,YOUAREREQUIREDTOGOTHROUGHTHESERVLETCONTEXTTOGETAREQUESTDISPATCHERTODOTHEACTUALFORWARDBECAUSEACLUSTERINGCONTAINERMAYHAVEDECIDEDTOPUTTHEJSPPAGEONADIFFERENTMACHINETHANTHEONEEXECUTINGTHESERVLETASARESULT,IFYOUWERETODIRECTLYTRYTOACCESSTHESERVLETINSTANCEINSIDETHEJVM,SUCHASWEUSEDTOVIATHEGETSERVLETCALL,THEREQUESTWOULDFAILMISERABLYINSOMERESPECTS,THISISALSOWHYTHEJAVANAMINGANDDIRECTORYINTERFACEJNDIWASINVENTEDTOPROVIDEACOMMONAPIFORLOOKINGUPRESOURCESRATHERTHANHAVINGTOUSEPERSPECIFICATIONAPISSUCHASTHATPROVIDEDBYTHERMINAMINGCLASSITSNOACCIDENTTHATTHEJNDISTARTINGPOINTISCALLEDANINITIALCONTEXTASMAYNOWBEAPPARENTTOYOU,WRITINGCOMPONENTSISDIFFERENTFROMWHATYOUMAYHAVEEXPECTEDFROMAPPLICATIONDEVELOPMENTINFACT,WHENWRITINGCOMPONENTSYOURENOTDOINGAPPLICATIONDEVELOPMENTATALLYOUREWRITINGLIBRARIESTHATAREBEINGCALLEDBYANEXISTINGAPPLICATIONPARTOFBEINGACOMPONENTINSTEADOFANAPPLICATIONISTHATYOURCODEMUSTTAKEONTHESAMEKINDSOFCHARACTERISTICSTHATMAKEWRITINGLIBRARIESAGAIN,ASOPPOSEDTOAPPLICATIONSSOMUCHFUNFOREXAMPLE,INORDERTOBESTPROMOTEINDIVIDUALCOMPONENTFLEXIBILITY,ITSUSUALLYBETTERTODEFINETYPESEXPOSEDTOTHELIBRARYCLIENTINTERMSOFINTERFACES,RATHERTHANACTUALCONCRETEOBJECTSBLOCH,ITEM16,PARTICULARLYSINCETHATENABLESYOURCOMPONENTSTOPROVIDEANINTERESTING“HOOKPOINT“SEEITEM6FORFUTUREUSEOFCOURSE,INLARGEMEASURETHISISALREADYTRUEFORBUILDINGCOMPONENTSDIRECTLYACCESSEDBYTHEJ2EECONTAINER,SUCHASSERVLETSREMEMBERJAVAXSERVLETSERVLETANDEJBSJAVAXEJBSESSIONBEAN,JAVAXEJBENTITYBEAN,ANDJAVAXEJBMESSAGEDRIVENBEANBUTTHISCANALSOBETRUEFORYOUROWNDOMAINCLASSES,SUCHASYOURHTTPSESSIONBOUNDMODELOBJECTS,FORTHESAMEREASONSTOWARDTHISEND,YOULLALSOWANTTOPAYCAREFULATTENTIONTOHOWCLIENTSCONSTRUCTYOURDOMAINOBJECTSBLOCH,ITEM1,WHETHERYOUPERMITOTHERSTOINHERITFROMYOURDOMAINOBJECTSBLOCH,ITEM15,ANDWHATKINDSOFTYPESYOUHANDBACKFROMYOURCOMPONENTSBLOCH,ITEM34ONEIMPORTANTREALIZATIONFROMTHISISTHEFACTTHATJ2EECOMPONENTS,WITHVERYLITTLEEXCEPTION,AREENTIRELYPASSIVEENTITIESINOTHERWORDS,J2EECOMPONENTSMUSTBORROWALOGICALTHREADOFCONTROLFROMTHECONTAINERINORDERTOCARRYOUTANYMEANINGFULWORKTHISNOTIONOFTHELOGICALTHREADOFCONTROL,USUALLYEXPRESSEDASANACTUALTHREADITSELFINOTHERWORDS,THECONTAINERCALLSINTOYOURCODEUSINGATHREADTHATITCREATED,USUALLYINRESPONSETOANENDUSERREQUESTSOMEWHEREBACKUPTHECHAIN,ISOFTENCALLEDANACTIVITYORCAUSALITY,ANDITMEANSTHATYOUSHOULDNTWRITECOMPONENTSTHATEXPECTTODOANYTHINGTOOOBSESSIVEWITHTHATBORROWEDTHREADDONTGOOFFANDCALCULATEPITOTHEHUNDREDTHDIGIT,FOREXAMPLEBECAUSETHECONTAINEREXPECTSTOGETTHATLOGICALTHREADOFCONTROLBACKATSOMEPOINTIFITDOESNT,ITCOULDVERYWELLCONSIDERTHATYOURCOMPONENTHASHUNGANDDECIDETOUNLOADYOURCOMPONENTINSTANCEENTIRELYTHISCREATESABITOFAQUANDARYWITHINTHEJ2EESPECIFICATIONBECAUSEFREQUENTLYTASKSCANTBEACCOMPLISHEDINANYREASONABLEFASHIONEXCEPTBYHAVINGATHREADUNDERPERSONALCONTROLCLASSICEXAMPLESARETHEDESIRETOPOLLSOMEEXTERNALRESOURCEEVERYNSECONDS,TOPERFORMSOMEKINDOFMAINTENANCEORNIGHTLYOPERATIONATMIDNIGHTEVERYNIGHT,ANDSOONTHISFUNCTIONALITYISCOMINGASPARTOFTHEEJB21SPECIFICATIONINTHEFORMOFTHETIMERSERVICE,BUTFORTHOSEWORKINGWITHCONTAINERSTHATPREDATETHATSPECIFICATION,NOSTANDARDJ2EESOLUTIONEXISTS,EXCEPTTOWRITEASTANDALONEAPPLICATIONTHATCALLSINTOTHECONTAINERVIAHTTPREQUEST,EJBSESSIONBEANCALL,ORJMSMESSAGEQUEUEDELIVERY,THEREBYGIVINGTHECONTAINERTHATLOGICALTHREADOFCONTROLULTIMATELY,AGAIN,THEKEYCHARACTERIZATIONOFTHEJ2EEAPPLICATIONISITSCOMPONENTCENTRICNATURE,ANDASAJ2EEDEVELOPER,YOUHAVETOPLAYINTOTHATMODELYOURSELFFAILURETODOSOMEANSSWIMMINGUPSTREAMAGAINSTTHEDECISIONSESTABLISHEDBYTHEJ2EECONTAINER,ANDINMANYCASESTHISRESULTSINALARGEAMOUNTOFCODETHATCONTRADICTSTHEPOLICIESESTABLISHEDBYTHECONTAINERWHILEYOUMAYBEABLETOGETAWAYWITHITINTODAYSVERSIONOFTHECONTAINER,DONTBESURPRISEDIFTOMORROWSVERSIONSUDDENLYBREAKSYOURCODEINSTEAD,GOWITHTHECURRENTBYEMBRACINGTHECOMPONENTCONCEPT,ANDWHEREYOUNEEDTOESCAPETHECONTAINERFORSOMEREASON,DOSOBYWRITINGASTANDALONEDAEMONPROCESSORAPPLICATION中文翻译第二章架构理论与实践之间,从理论的角度来看没有差异;然而,从实践的角度来看,差异确实存在。JANLAVANDESNEPSCHEUT架构这是一个位于设计之上的层次,在此我们能够瞥见系统的最终轮廓、它将如何被构建,以及整个应用和系统的总体视图。当你为企业级应用和系统规划基本流程和设计的时候,牢记以下项中包含的建议,你就能向优雅的目标迈进建立一个能够对高性能、高可扩展性的企业级系统提供支撑的架构。第1项优先采用构件作为开发、部署和重用的核心元素许多JAVA开发者在首次尝试构建基于J2EE的项目时,面临的诸多困难之一,就是J2EE应用的构建方式不同于传统的JAVA应用J2EE不是构建应用,而是委托现有的应用来生成要插入的构件的结构,这个现有的应用即J2EE容器自身。乍一看似乎区别不大,但从两个不同的方面来看,其实隐含了巨大区别。首先,这表明开发者不再对构建对象本身感兴趣,而是专注于创建严密封装的构件,在J2EE环境中,构件由构成其的互相紧耦合的对象组成。第二,这表明我们必须遵守一系列严苛的规则,即使是作为构件的开发者,我们也不能违反这一点。学习面向对象技术的开发者,从很早的时候起,就不断地被告诫,要提倡封装和数据隐藏。我们都还记得大师们教导的金玉良言。例如,“绝不使用公有域(PUBLICFIELD);而是编写读取器(ACCESSOR)和修改器(MUTATOR)方法(用JAVABEAN术语表示,就是GETTER和SETTER方法)”,或是“对客户的视图隐藏你的实现”。因此,对曾经写过的每个类,我们都忠实地为每个私有字段加上GET/SET方法对,以及编写缺省构造器等等。遗憾的是,这样就几乎偏离了面向对象提倡者们原来的想法。仅仅强迫客户使用GET方法,以得到对某个内部持有的数据结构的引用,并不能称为封装。这个问题很久之前就已经在EFFECTIVECMEYERS95一书里指出了,更近一点的,EFFECTIVEJAVABLOCH,第24项也同样指出了这个问题。更严重的是,这会误导开发者在过于小的规模下(类和对象)考虑有效重用问题,而不是像JAVABEAN规范最初的意图那样,在较大的规模下去考虑重用。还不相信让我们考虑一个常见的集合类,比如ARRAYLIST。我们可以把ARRAYLIST作为单独对象使用。不过要是想遍历集合的内容,如果不是明显地必需的话,至少也是希望能够用另一个对象,也就是ITERATOR实现类的对象。在类/对象的层次考虑重用,意味着我们要着重于考虑对“独立于ARRAYLIST绑定的ITERATOR实现类”进行重用,这显然没有意义。由于这两个类本来就应该成对使用,所以这意味着我们应该在更高层次去考虑重用,这也就是我们称为构件(COMPONENT)的层次。在实际环境下,它通常是一个单独的JAR文件,在本例中它里面包含了两个类ARRAYLIST及其内部的ITERATOR子类型。在使用COLLECTION接口的情况下,还要包括像ITERATOR、COLLECTION和LIST这样的相关接口,因为它们作为一个整体共同定义了客户能够信任的契约。这把我们带入了对耦合的讨论。紧耦合的定义是,如果一个给定的“事物”必须做出变化,以适应另一“事物”的变化,我们就称前者紧耦合于后者。换句话说,考虑ARRAYLIST,如果我改变了COLLECTION接口的定义,ARRAYLIST需要改变吗当然要,因为ARRAYLIST通过LIST也实现了COLLECTION接口。如果我改变ARRAYLIST的内部实现,那么其内部的ITERATOR实现需要改变吗当然要。不过,客户端代码需要改变吗不久之前客户端代码还把ITERATOR当作通用类型的ITERATOR(并且没有向下转型)。尽管ARRAYLIST与其内部的ITERATOR紧密耦合(反之亦然),不过只要客户端代码严格遵循接口编程,就能与ARRAYLIST保持松耦合关系。(松耦合将在第2项中进行详细讨论,不过这里我要提前引用一下。)还没看到联系吗我们考虑一个基于SERVLET的WEB应用程序。如果我们遵循传统的模型视图控制器模式(MVC)1,那么至少要编写两个类,它们或多或少是紧耦合关系控制器SERVLET用来对进入的HTTP请求进行处理,然后把请求转发到视图JSP。控制器需要知道视图。1这里其实有点用词不当符合题意的恰当模式是表示抽象控制器模式的这些过程,除此之外还可以参考(PRESENTATIONABSTRACTIONCONTROLLER)POSA1,145,因为MVC用来处理多个视图,并且视图能同步更新,这种方式在EXCEL或WORD这样的GUI应用中很常见。所依赖的数据元素,视图需要知道控制器已经做了哪些处理,以免重复工作。二者必须对视图所依赖的数据元素被绑定的名称达成一致。(HTTPSESSION的“名称值”属性提供了延迟绑定,而不是松耦合;详细讨论请参阅第2项)此外,控制器和视图都紧耦合于模型类,因为它们需要知道组成模型所使用的数据元素。问问你自己单单重用控制器而不管相应的视图类/模型类,真的可行吗视图能够在不先进入控制器SERVLET的情况下被成功执行吗对这个问题的回答一般总是“不行”。这表明,对于给定构件里的类,本例中就是你的表示层构件,相互之间暗含着紧耦合。这就产生了这样一种现实状况对于紧耦合已经存在的地方,我们可以对传统的“全面封装”规则稍微放松一些,尽管我们曾经如此盲目地遵守这个规则。当然我并不是在建议,为了方便对字段进行访问立刻删除所有GET/SET方法,我的建议是,你应该对真正要保护的东西深思熟虑。例如,如果你的模型对象并不在表示层(注意这个术语;请参阅第3项)之外使用,尤其是当这些模型对象只是对数据的简单包装时,比如“数据传输对象”(DATATRANSFEROBJECT)FOWLER,401,还要为每个字段加上GET/SET方法,真的有意义吗请记住,封装是用来在具体实现发生变化的时候,为了保护客户端代码而设计的,其目的并不是在构件自身发生改变时,来保护构件。(开发者几乎不能从对单个的类进行封装中得到益处,因此只要把构件想象成更大、粒度更粗的类,你就离目标不远了。)假定我们有几个类,它们相互之间紧密协作,以完成一些有用的工作。这些类要么被一起部署,要么就都不被部署。我们在寻找某种“大于对象”的东西,作为部署的核心单元。换句话说,我们要寻求的正是构件。SERVLET规范已经抛弃了把单个SERVLET部署到SERVLET容器中的作法,而是采用WEB应用的思想。WEB应用是一系列资源,诸如SERVLET、JSP、模型类、工具类、以及静态资源(HTML、图像、声音文件等),它们共同地相互协作以提供所需功能。WEB应用采用单一的WAR文件部署,所以不可能出现(A)只部署了部分应用;或(B)应用的各个部件之间的版本不匹配。实际上,WAR文件和JAVA的JAR文件目的相同,都是为了使应用的部署更加容易;如果你曾经使用过JAVA10,那么你一定还记得“把CLASS文件解压缩到CLASSPATH指定的路径下”这种部署风格,同时你也会认同,那时候的JAVA应用的部署方式不那么优雅。WAR文件提供的原子性部署意味着,只有那些被认为是WEB应用的组成部分的资源才会真正出现在部署之后的应用里。也就是说,只有你故意强行拷贝单独的文件到部署后的应用目录中,才会出现局部的基于“替换文件”的部署。这么做并不好,原因很多。一个重要原因是可能会引入版本不匹配的问题。“只拷贝发生变化的文件到部署目录”看起来很有诱惑力,但是人们太容易忘记什么发生了改变,更重要的是,SERVLET容器并不能以我们的观点去看待应用发生了什么样的变化。考虑一下CLASSLOADER。还记得吗它由SERVLET容器创建,用来把你的WEB应用从硬盘加载到JAVA虚拟机。每当WEB应用发生“改变”,通常是“硬盘部署目录的内容发生变化”的时候,SERVLET容器需要创建一个新的CLASSLOADER。但你要是仔细阅读SERVLET规范就会发现,当新的CLASSLOADER被启动时,它加载的是整个WEB应用,而不是某个单独的SERVLET。因为容器把整个WEB应用当作单个构件,所以组成WEB应用的所有CLASS都要由同一个CLASSLOADER加载。因此我们完全可以想象每当有一个文件被拷贝到部署目录时,就会产生一个新的CLASSLOADER实例,从而要执行加载整个WEB程序的所有额外工作,这并不会带来任何实际效益。顺便提一下,要确保理解类加载策略所产生的切实效果,请阅读第70项。这些问题的关键是,SERVLET(或J2EE中的其它)规范希望你使用构件来构造WEB应用,而不是使用单独的类。JSP规范则更进一步通过鼓励“可重用标记库”的概念,促进了较小规模构件在WEB应用内部以及跨越WEB应用中的开发和使用。规范并不关心你
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论