發(fā)文章
發(fā)文工具
撰寫(xiě)
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
Spring簡(jiǎn)介 關(guān)于Spring Framework,今年夏天你可能已經(jīng)聽(tīng)見(jiàn)很多的議論。在本文中,我將試圖解釋Spring能完成什么,和我怎么會(huì)認(rèn)為它能幫助你開(kāi)發(fā)J2EE應(yīng)用程序。 另一framework? 你可能正在想“不過(guò)是另外一個(gè)的framework”。當(dāng)已經(jīng)有許多開(kāi)放源代碼(和專(zhuān)有) J2EE framework時(shí),為什么你應(yīng)該費(fèi)心讀這篇文章,或下載Spring Framework? 我相信Spring是獨(dú)特的,因?yàn)槿舾蓚€(gè)原因: . 它定位的領(lǐng)域是許多其他流行的framework沒(méi)有的。Spring關(guān)注提供一種方法管理你的業(yè)務(wù)對(duì)象。 . Spring是全面的和模塊化的。Spring有分層的體系結(jié)構(gòu),這意味著你能選擇使用它孤立的任何部分,它的架構(gòu)仍然是內(nèi)在穩(wěn)定的。因此從你的學(xué)習(xí)中,你可得到最大的價(jià)值。例如,你可能選擇僅僅使用Spring來(lái)簡(jiǎn)單化JDBC的使用,或用來(lái)管理所有的業(yè)務(wù)對(duì)象。 . 它的設(shè)計(jì)從底部幫助你編寫(xiě)易于測(cè)試的代碼。Spring是用于測(cè)試驅(qū)動(dòng)工程的理想的framework。 Spring對(duì)你的工程來(lái)說(shuō),它不需要一個(gè)以上的framework。Spring是潛在地一站式解決方案,定位于與典型應(yīng)用相關(guān)的大部分基礎(chǔ)結(jié)構(gòu)。它也涉及到其他framework沒(méi)有考慮到的內(nèi)容。 盡管它僅僅是一個(gè)從2003年2月才開(kāi)始的開(kāi)源工程,但Spring有較長(zhǎng)的歷史根基。這個(gè)開(kāi)源工程是起源自我在2002年后期出版的《Expert One-on-One J2EE設(shè)計(jì)與開(kāi)發(fā)》書(shū)中的基礎(chǔ)代碼。這本書(shū)展示了Spring背后的基礎(chǔ)架構(gòu)。然而,這個(gè)基礎(chǔ)架構(gòu)的概念要追溯到2000年的早些時(shí)候,并且反映了我為一系列成功的商業(yè)工程開(kāi)發(fā)基礎(chǔ)結(jié)構(gòu)的經(jīng)驗(yàn)。 從2003年1月,Spring已經(jīng)落戶(hù)于SourceForge上?,F(xiàn)在有10個(gè)開(kāi)發(fā)人員,其中6是高度投入的積極分子。 Spring的架構(gòu)性的好處 在我們進(jìn)入細(xì)節(jié)以前,讓我們看一下Spring可以給一個(gè)工程帶來(lái)的一些好處: . Spring能有效地組織你的中間層對(duì)象,無(wú)論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會(huì)發(fā)現(xiàn)Spring關(guān)注了遺留下的問(wèn)題,。 . Spring能消除在許多工程上對(duì)Singleton的過(guò)多使用。根據(jù)我的經(jīng)驗(yàn),這是一個(gè)主要的問(wèn)題,它減少了系統(tǒng)的可測(cè)試性和面向?qū)ο筇匦浴?nbsp;. Spring能消除使用各種各樣格式的屬性定制文件的需要,在整個(gè)應(yīng)用和工程中,可通過(guò)一種一致的方法來(lái)進(jìn)行配置。曾經(jīng)感到迷惑,一個(gè)特定類(lèi)要查找迷幻般的屬性關(guān)鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡(jiǎn)單地看到類(lèi)的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡(jiǎn)化。 . Spring能通過(guò)接口而不是類(lèi)促進(jìn)好的編程習(xí)慣,減少編程代價(jià)到幾乎為零。 . Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴(lài)于他的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒(méi)有依賴(lài)于Spring。 . 使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試。 . Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來(lái)實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。 . Spring幫助你解決許多問(wèn)題而無(wú)需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性事務(wù)而不通過(guò)使用EJB容器,如果你僅僅需要與單個(gè)的數(shù)據(jù)庫(kù)打交道,甚至不需要JTA實(shí)現(xiàn)。 . Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R mapping產(chǎn)品(如Hibernate)。 Spring確實(shí)使你能通過(guò)最簡(jiǎn)單可行的解決辦法解決你的問(wèn)題。這些特性是有很大價(jià)值的。 Spring能做什么? Spring提供許多功能,在此我將快速地依次展示其各個(gè)主要方面。 任務(wù)描述: 首先,讓我們明確Spring范圍。盡管Spring覆蓋了許多方面,但我們已經(jīng)有清楚的概念,它什么應(yīng)該涉及和什么不應(yīng)該涉及。 Spring的主要目的是使J2EE易用和促進(jìn)好編程習(xí)慣。 Spring不重新開(kāi)發(fā)已有的東西。因此,在Spring中你將發(fā)現(xiàn)沒(méi)有日志記錄的包,沒(méi)有連接池,沒(méi)有分布事務(wù)調(diào)度。這些均有開(kāi)源項(xiàng)目提供(例如Commons Logging 用來(lái)做所有的日志輸出,或Commons DBCP用來(lái)作數(shù)據(jù)連接池),或由你的應(yīng)用程序服務(wù)器提供。因?yàn)橥瑯拥牡脑?,我們沒(méi)有提供O/R mapping層,對(duì)此,已有有好的解決辦法如Hibernate和JDO。 Spring的目標(biāo)是使已存在的技術(shù)更加易用。例如,盡管我們沒(méi)有底層事務(wù)協(xié)調(diào)處理,但我們提供了一個(gè)抽象層覆蓋了JTA或任何其他的事務(wù)策略。 Spring沒(méi)有直接和其他的開(kāi)源項(xiàng)目競(jìng)爭(zhēng),除非我們感到我們能提供新的一些東西。例如,象許多開(kāi)發(fā)人員,我們從來(lái)沒(méi)有為Struts高興過(guò),并且感到在MVC web framework中還有改進(jìn)的余地。在某些領(lǐng)域,例如輕量級(jí)的IoC容器和AOP框架,Spring有直接的競(jìng)爭(zhēng),但是在這些領(lǐng)域還沒(méi)有已經(jīng)較為流行的解決方案。(Spring在這些區(qū)域是開(kāi)路先鋒。) Spring也得益于內(nèi)在的一致性。 所有的開(kāi)發(fā)者都在唱同樣的的贊歌,基礎(chǔ)想法依然是Expert One-on-One J2EE設(shè)計(jì)與開(kāi)發(fā)的那些。 并且我們已經(jīng)能夠使用一些主要的概念,例如倒置控制,來(lái)處理多個(gè)領(lǐng)域。 Spring在應(yīng)用服務(wù)器之間是可移植的。 當(dāng)然保證可移植性總是一次挑戰(zhàn),但是我們避免任何特定平臺(tái)或非標(biāo)準(zhǔn)化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應(yīng)用服務(wù)器上的用戶(hù)。 倒置控制容器 Spring的設(shè)計(jì)核心是 org.springframework.beans 包, 為與JavaBeans一起工作而設(shè)計(jì)。 這個(gè)包一般不直接被用戶(hù)使用, 但作為基礎(chǔ)為更多的其他功能服務(wù). 下一個(gè)較高層面的抽象是"Bean Factory"。 Spring bean factory 是一個(gè)普通的Factory,它使對(duì)象能夠按名稱(chēng)獲取,并且能管理對(duì)象之間的關(guān)系。 Bean factories 支持兩種對(duì)象模式: . Singleton:在此模式中,有一個(gè)具有特定名稱(chēng)的共享對(duì)象實(shí)例,它在查找時(shí)被獲取。這是默認(rèn)的,而且是最為經(jīng)常使用的。它對(duì)于無(wú)狀態(tài)對(duì)象是一種理想的模式。 .Prototype:在此模式中,每次獲取將創(chuàng)建一個(gè)獨(dú)立的對(duì)象。例如,這可以被用于允許用戶(hù)擁有他們自己的對(duì)象。 由于 org.springframwork.beans.factory.BeanFactory是一個(gè)簡(jiǎn)單的接口,它能被為了底層存儲(chǔ)方法而實(shí)現(xiàn)。你能夠方便地實(shí)現(xiàn)你自己的BeanFactory,盡管很少用戶(hù)需要。最為常用的定義是: .XmlBeanFactory: 可解析簡(jiǎn)單直觀的定義類(lèi)和命名對(duì)象屬性的XML結(jié)構(gòu)。 我們提供了一個(gè)DTD來(lái)使編寫(xiě)更容易。 .ListableBeanFactoryImpl:可提供解析存放在屬性文件中的bean定義,和可通過(guò)編程創(chuàng)建BeanFactories。 每個(gè)bean定義可能是一個(gè)POJO(通過(guò)類(lèi)名和JavaBean初始屬性定義),或是一個(gè)FactoryBean。FactoryBean接口添加了一個(gè)間接層。通常,這用于使用AOP或其他方法來(lái)創(chuàng)建代理對(duì)象:例如,添加了聲明性事務(wù)管理的代理。(這在概念上和EJB偵聽(tīng)相似,但在實(shí)踐中實(shí)現(xiàn)更簡(jiǎn)單。) BeanFactories能在一個(gè)層次結(jié)構(gòu)中可選擇性的參與,根據(jù)來(lái)自祖先的繼承定義。這使在整個(gè)應(yīng)用中公共配置的共享成為可能,雖然個(gè)別資源,如controller servlets,也擁有他們自己的獨(dú)立的對(duì)象集合。 這種使用JavaBeans的動(dòng)機(jī)在<Expert One-on-One J2EE Design and Development>的第四章中有描述,在TheServerSide網(wǎng)站上的有免費(fèi)的PDF(http://www./resources/article.jsp?l=RodJohnsonInterview). 通過(guò)BeanFactory概念,Spring成為一個(gè)倒置控制的容器。(我非常不喜歡container這個(gè)術(shù)語(yǔ),因?yàn)樗谷寺?lián)想到重量級(jí)容器,如EJB容器。Spring的BeanFactory是一個(gè)可通過(guò)一行代碼創(chuàng)建的容器,并且不需要特殊的部署步驟。) 位于倒置控制背后的概念是在Hollywood原則中經(jīng)常表述:"Don’t call me, I’ll call you." IoC將控制職責(zé)搬進(jìn)了框架中,并脫離應(yīng)用代碼。涉及到配置的地方,意思是說(shuō)在傳統(tǒng)的容器體系結(jié)構(gòu)中,如EJB,一個(gè)組件可以調(diào)用容器并問(wèn)“我需要它給我做工作的對(duì)象X在哪里?”;使用IoC容器則只需指出組件需要X對(duì)象,在運(yùn)行時(shí)容器會(huì)提供給它。容器基于方法名作出這種說(shuō)明,或可能根據(jù)配置數(shù)據(jù)如XML。 倒置控制的幾個(gè)重要好處。如: . 因?yàn)榻M件不需要在運(yùn)行時(shí)間尋找合作者,所以他們可以更簡(jiǎn)單的編寫(xiě)和維護(hù)。在Spring的IoC版本里,組件通過(guò)暴露JavaBean的setter方法表達(dá)他們依賴(lài)的其他組件。這相當(dāng)于EJB通過(guò)JNDI來(lái)查找,EJB查找需要開(kāi)發(fā)人員編寫(xiě)代碼。 . 同樣原因,應(yīng)用代碼更容易測(cè)試。JavaBean屬性是簡(jiǎn)單的,Java核心的,并且容易測(cè)試:僅編寫(xiě)一個(gè)包含自身的Junit測(cè)試方法用來(lái)創(chuàng)建對(duì)象和設(shè)置相關(guān)屬性即可。 . 一個(gè)好的IoC實(shí)現(xiàn)隱藏了強(qiáng)類(lèi)型。如果你使用一個(gè)普通的factory來(lái)尋找合作者,你必須通過(guò)類(lèi)型轉(zhuǎn)換將返回結(jié)果轉(zhuǎn)變?yōu)橄胍念?lèi)型。這不是一個(gè)主要問(wèn)題,但是不雅觀。使用IoC,你在你的代碼中表達(dá)強(qiáng)類(lèi)型依賴(lài),框架將負(fù)責(zé)類(lèi)型轉(zhuǎn)換。這意味著在框架配置應(yīng)用時(shí),類(lèi)型不匹配將導(dǎo)致錯(cuò)誤;在你的代碼中,你無(wú)需擔(dān)心類(lèi)型轉(zhuǎn)換異常。 . 大部分業(yè)務(wù)對(duì)象不依賴(lài)于IoC容器的APIs。這使得很容易使用遺留下來(lái)的代碼,且很容易的使用對(duì)象無(wú)論在容器內(nèi)或不在容器內(nèi)。例如,Spring用戶(hù)經(jīng)常配置Jakarta Commons DBCP數(shù)據(jù)源為一個(gè)Spring bean:不需要些任何定制代碼去做這件事。我們說(shuō)一個(gè)IoC容器不是侵入性的:使用它并不會(huì)使你的代碼依賴(lài)于它的APIs。任何JavaBena在Spring bean factory中都能成為一個(gè)組件。 最后應(yīng)該強(qiáng)調(diào)的是,IoC 不同于傳統(tǒng)的容器的體系結(jié)構(gòu)( 如EJB), 應(yīng)用代碼最小程度的依靠于容器。這意味著你的業(yè)務(wù)對(duì)象可以潛在的被運(yùn)行在不同的IoC 框架上-或者在任何框架之外-不需要任何代碼改。 以我的經(jīng)驗(yàn)和作為Spring用戶(hù),過(guò)分強(qiáng)調(diào)IoC給應(yīng)用代碼帶來(lái)的好處是不容易的。 IoC不是一個(gè)新概念,但是它在J2EE團(tuán)體里面剛剛到達(dá)黃金時(shí)間。 有一些可供選擇的IoC 容器: notably, Apache Avalon, PicoContainer 和 HiveMind. Avalon 不會(huì)成為特別流行的,盡管它很強(qiáng)大而且有很長(zhǎng)的歷史。Avalon是相當(dāng)?shù)闹亓考?jí)和復(fù)雜的,并且看起來(lái)比新的IoC解決方案更具侵入性。 PicoContainer是一個(gè)輕量級(jí)而且更強(qiáng)調(diào)通過(guò)構(gòu)造器表達(dá)依賴(lài)性而不是JavaBean 屬性。 與Spring不同,它的設(shè)計(jì)允許每個(gè)類(lèi)型一個(gè)對(duì)象的定義(可能局限性結(jié)果來(lái)自它對(duì)Java代碼外的元數(shù)據(jù)的拒絕)。作為和Spring and PicoContainer and other IoC frameworks的比較,可參看文章http://www./docs/lightweight_container.html. 這個(gè)業(yè)面包含了PicoContainer站點(diǎn)鏈接 。 Spring BeanFactories 是非常輕量級(jí)的。用戶(hù)已經(jīng)成功地將他們應(yīng)用在applets中和單獨(dú)的Swing應(yīng)用中。(它們也很好地工作在EJB容器中。) 沒(méi)有特殊的部署步驟和可察覺(jué)的啟動(dòng)時(shí)間。這個(gè)能力表明一個(gè)容器在應(yīng)用的任何層面差不多立即可以發(fā)揮非常大的價(jià)值。 Spring BeanFactory 概念應(yīng)用貫穿于Spring整體, 而且是Spring如此內(nèi)在一致的關(guān)鍵原因。在IoC容器中,Spring也是唯一的,它使用IoC作為基礎(chǔ)概念貫穿于整個(gè)框架。 對(duì)應(yīng)用開(kāi)發(fā)人員,最重要的是,一個(gè)或多個(gè)BeanFactory提供一個(gè)定義明確的業(yè)務(wù)對(duì)象層。這是類(lèi)似的,但比local session bean層更簡(jiǎn)單。與EJBs不同,在這個(gè)層中的對(duì)象可能是相關(guān)的,并且他們的關(guān)系被自己的factory管理。有一個(gè)定義明確的業(yè)務(wù)對(duì)象層對(duì)于一個(gè)成功的體系結(jié)構(gòu)是非常重要的。 Spring ApplicationContext 是BeanFactory的子接口,為下列提供支持: .消息尋找,國(guó)際化支持 .事件機(jī)制,允許應(yīng)用對(duì)象發(fā)布和隨意地注冊(cè)為事件監(jiān)聽(tīng) .便攜文件和資源訪(fǎng)問(wèn) XmlBeanFactory示例 Spring用戶(hù)通常在XML“bean定義”文件中配置他們的應(yīng)用。Spring的XML bean定義文檔的根是一個(gè)<beans> 元素。該元素包含一個(gè)或多個(gè) <bean>定義。我們一般指定一個(gè)bean定義的類(lèi)和屬性。我們也必須指定ID作為標(biāo)識(shí),我們將在代碼中使用該標(biāo)志。 讓我們來(lái)看一個(gè)簡(jiǎn)單的例子,在J2EE應(yīng)用中常看到用來(lái)配置三個(gè)應(yīng)用對(duì)象: . J2EE DataSource . 使用DataSource的DAO . 在處理過(guò)程中使用DAO的業(yè)務(wù)對(duì)象 在下面的例子中,我們使用一個(gè)來(lái)自Jakarta Commons DBCP項(xiàng)目的BasicDataSource。這個(gè)class(和其他存在的class一樣)可以簡(jiǎn)單地被應(yīng)用在Spring bean factory中,因?yàn)樗峁┝薐avaBean格式的配置。需要在shutdown時(shí)被調(diào)用的Close方法可通過(guò)Spring的"destroy-method"屬性被注冊(cè),來(lái)避免BasicDataSource需要實(shí)現(xiàn)任何Spring 接口。 代碼: <textarea><beans> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://localhost:3306/mydb</value></property> <property name="username"><value>root</value></property> </bean> </textarea>我們感興趣的BasicDataSource的所有屬性都是String型的,因此,我們用<value>元素來(lái)指定他們的值。如果必要的話(huà),Spring使用標(biāo)準(zhǔn)的 JavaBean屬性編輯器機(jī)制來(lái)轉(zhuǎn)換String以表示其他的類(lèi)型。 現(xiàn)在,我們定義了DAO,它有一個(gè)對(duì)DataSource的bean引用。Bean間關(guān)系通過(guò)<ref>元素來(lái)指定: 代碼: <textarea><bean id="exampleDataAccessObject" class="example.ExampleDataAccessObject"> <property name="dataSource"> <ref bean="myDataSource"/> </property> </bean> </textarea>業(yè)務(wù)對(duì)象有一個(gè)DAO的引用和一個(gè)int型屬性(exampleParam): 代碼: <textarea><bean id="exampleBusinessObject" class="example.ExampleBusinessObject"> <property name="dataAccessObject"><ref bean="exampleDataAccessObject"/></property> <property name="exampleParam"><value>10</value></property> </bean></beans> </textarea> 對(duì)象間的關(guān)系一般在配置中明確地設(shè)置,象此例子一樣。我們認(rèn)為這樣做是件好事情。無(wú)論如何,Spring也提供了我們叫做"autowire"的支持, 一個(gè)la PicoContainer,在那里,它可以指出bean間的依賴(lài)關(guān)系。這樣做的局限性-如使用PicoContainer-是如果有一個(gè)特殊類(lèi)型的多個(gè)Bean,要作出一個(gè)類(lèi)型應(yīng)該與哪個(gè)實(shí)例相關(guān)的判斷將是不可能的。好的方面,在factory初始化后,不理想的依賴(lài)可能會(huì)被捕獲到。(Spring 也為清楚的配置提供一種可選的依賴(lài)檢查,它可以完成這個(gè)目的) 如果我們不想明確的編寫(xiě)他們的關(guān)系,在上面的例子中,我們可如下使用autowire特性: <textarea> <bean id="exampleBusinessObject" class="example.ExampleBusinessObject" autowire="byType"> <property name="exampleParam"><value>10</value></property> </bean> </textarea> 使用這用用法,Spring將找出exampleBusinessObject的dataSource屬性應(yīng)該被設(shè)置為在當(dāng)前BeanFactory中找到的DataSource實(shí)現(xiàn)。在當(dāng)前的BeanFactory中,如果所需要類(lèi)型的bean不存在或多于一個(gè),將產(chǎn)生一個(gè)錯(cuò)誤。我們依然要設(shè)置exampleParam屬性,因?yàn)樗皇且粋€(gè)引用。 Autowire支持和依賴(lài)檢查剛剛加入CVS并將在Spring 1.0 M2(到10/20,2003)中提供。本文中所討論的所有其他特性都包含在當(dāng)前1.0 M1版本中。 來(lái)自Java代碼的外在關(guān)系比硬編碼有極大的好處,因?yàn)楦淖僗ML文件而無(wú)需改變一行Java代碼是可能的。例如,我們可以簡(jiǎn)單地改變myDataSource的bean定義來(lái)提供不同的bean class以使用一個(gè)可供選擇的連接池,或者一個(gè)測(cè)試數(shù)據(jù)源。 在一個(gè)單獨(dú)可選的XML片斷中,我們可以用Spring的JNDI 定位FactoryBean來(lái)從application server獲取一個(gè)數(shù)據(jù)源。 現(xiàn)在讓我們來(lái)看例子中業(yè)務(wù)對(duì)象的java 代碼。注意下面列出的代碼中沒(méi)有對(duì)Spring的依賴(lài)。不像EJB容器,Spring BeanFactory不是侵入性的:在應(yīng)用對(duì)象里面你通常不需要對(duì)他們編碼。 代碼: public class ExampleBusinessObject implements MyBusinessObject { private ExampleDataAccessObject dao; private int exampleParam; public void setDataAccessObject(ExampleDataAccessObject dao) { this.dao = dao; } public void setExampleParam(int exampleParam) { this.exampleParam = exampleParam; } public void myBusinessMethod() { // do stuff using dao } } 注意屬性設(shè)置器,在bean定義文檔中,它對(duì)應(yīng)與XML引用。這些將在對(duì)象使用之前被Spring調(diào)用. 這些應(yīng)用bean不需要依賴(lài)于Spring。他們不需要實(shí)現(xiàn)任何Spring接口或者繼承Spring的類(lèi):他們只需要遵守JavaBeans命名習(xí)慣。在Spring 應(yīng)用環(huán)境之外重用它們是非常簡(jiǎn)單的,例如,一個(gè)測(cè)試環(huán)境。只是例示它有默認(rèn)的構(gòu)造器,并且通過(guò)setDataSource()和setExampleParam()的調(diào)用來(lái)手工設(shè)置它的屬性。只要你有一個(gè)沒(méi)有參數(shù)的構(gòu)造器,如果你想在單行代碼支持程序化的創(chuàng)建,你可以自由定義其他的帶有多個(gè)屬性構(gòu)建的器。 注意,在業(yè)務(wù)接口中沒(méi)有聲明的JavaBean屬性將會(huì)一起工作。 他們是一個(gè)實(shí)現(xiàn)細(xì)節(jié)。我們可以插入帶有不同bean屬性的不同的實(shí)現(xiàn)類(lèi)而不影響連接對(duì)象或者調(diào)用代碼。 當(dāng)然,Spring XML bean factories 有更多的功能沒(méi)有在這里描述,但是,這將給你一種基本使用的感覺(jué)。同時(shí),簡(jiǎn)單的屬性和有JavaBean屬性編輯器的屬性,Spring可以自動(dòng)處理lists,maps和java.util.Properties.
來(lái)自: ShangShujie > 《j2ee》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶(hù) 評(píng)論公約
Introducing to Spring Framework(中文修訂版)
在Spring, PicoContainer 和其他 IoC frameworks之間做比較,可參看文章Spring網(wǎng)站上的"The Spring Framework - A Lightweight Container"位于http://www.springframework.org/docs/lightwe...
UC頭條:[面試必問(wèn)]Spring核心之控制反轉(zhuǎn)(IOC)
而采用IOC模式,將對(duì)象之間的依賴(lài)關(guān)系的控制權(quán)交給容器來(lái)管理,程序代碼只需要定義好依賴(lài)關(guān)系,容器就可以自動(dòng)地完成對(duì)象的創(chuàng)建、銷(xiāo)毀、管理和依賴(lài)注入等操作,從而降低了代碼的耦合度,提高了代碼的可...
spring的面試題
在沒(méi)有引入ioc容器之前,對(duì)象A依賴(lài)對(duì)象B,在A對(duì)象初始化或者運(yùn)行時(shí),自己必須主動(dòng)去創(chuàng)建B對(duì)象,控制權(quán)在自己的手上。引入ioc容器之后,全部對(duì)象的控制權(quán)都交給了ioc容器,當(dāng)對(duì)象A需要用到B對(duì)象的時(shí)候,...
Struts2,spring工作原理
Struts2,spring工作原理Struts2,spring工作原理 Struts2Struts2工作原理struts2面試題 闡述struts2的執(zhí)行流程。Struts 2的工作流程相對(duì)于Struts 1要簡(jiǎn)單,與WebWork框架基本相同,所以說(shuō)Struts...
spring面試題
所有的核心模塊,從基礎(chǔ)的Spring功能(如Spring Beans)到上層的Spring MVC框架,文章中都會(huì)進(jìn)行簡(jiǎn)短的講解。Spring Beans.Spring注解。在bean標(biāo)簽中有一個(gè)屬性為”singleton”,如果設(shè)為true,該bean是單...
spring有關(guān)的一些知識(shí)點(diǎn)
spring有關(guān)的一些知識(shí)點(diǎn)0,簡(jiǎn)單講下Sprng的由來(lái),以及各有什么變化最早對(duì)象的創(chuàng)建是由new關(guān)鍵字,但是如果產(chǎn)生的類(lèi)比較繁多或者負(fù)責(zé),就用工廠(chǎng)代替new關(guān)鍵字,但是工廠(chǎng)的控制能力有限,譬如對(duì)產(chǎn)生對(duì)象的生命...
Spring:源碼解讀Spring IOC原理
1 public interface BeanFactory { 2 3 //對(duì)FactoryBean的轉(zhuǎn)義定義,因?yàn)槿绻褂胋ean的名字檢索FactoryBean得到的對(duì)象是工廠(chǎng)生成的對(duì)象...
spring框架-認(rèn)識(shí)IOC(二)
但是日常開(kāi)發(fā)中,EJB類(lèi)似的已經(jīng)很少用到了,所以很多同學(xué)沒(méi)聽(tīng)過(guò)DL(依賴(lài)查找),這很正常,大家更熟悉的是DI(依賴(lài)注入)。使用3,4,5...
Spring框架之beans源碼完全解析
子類(lèi) Bean 會(huì)繼承父類(lèi) Bean 的所有屬性,子類(lèi) Bean 也可以覆蓋父類(lèi) Bean 的屬性。之所以需要從 singletonFactories 中加載,因?yàn)樵趧?chuàng)建...
微信掃碼,在手機(jī)上查看選中內(nèi)容