posts - 14,  comments - 8,  trackbacks - 0
           
          Spring MVC框架的高級(jí)配置

          時(shí)間:2006-06-08
          作者:Dejan Bosanac
          瀏覽次數(shù): 701
          本文關(guān)鍵字:Spring,?configuration,?source control,?CVS,?subversion,?配置,?源代碼控制


            本文將為您提供關(guān)于Spring MVC框架的配置技巧,以幫助管理基于Spring的web應(yīng)用程序的多個(gè)實(shí)例。本配置管理主題常被學(xué)術(shù)界所忽略,但是,這對(duì)于現(xiàn)實(shí)的web開發(fā)尤為重要。本主題并不直接關(guān)聯(lián)任何具體的技術(shù),因此,我們將從最基本的概念開始對(duì)這個(gè)問題進(jìn)行說明。下面,我們將根據(jù)Spring MVC框架,為基于本技術(shù)開發(fā)的項(xiàng)目提供一系列的解決方案。

          Spring配置

            人們經(jīng)常會(huì)在一臺(tái)以上的主機(jī)上配置一種Web應(yīng)用程序。例如,在生產(chǎn)中,一個(gè)網(wǎng)站可能只有一個(gè)實(shí)例。除了此實(shí)例外,開發(fā)人員可以在用于開發(fā)的機(jī)器上配置其他的(開發(fā))實(shí)例。也可以在公司(機(jī)構(gòu))內(nèi)部的本地開發(fā)服務(wù)器上維護(hù)其他應(yīng)用程序裝置,這將讓您受益匪淺。該實(shí)例的目的是使Web設(shè)計(jì)者可以獲得有質(zhì)量保證的材料,并為需要為應(yīng)用程序提供文件資料的人提供準(zhǔn)入。

            大家都知道,即使是最簡單的場(chǎng)景,也需要安裝、配置和維護(hù)三個(gè)實(shí)例。而對(duì)于位于不同地理位置的團(tuán)隊(duì)來說,要從事這樣的項(xiàng)目便更加困難。對(duì)于任何不是特別簡單的Web應(yīng)用程序項(xiàng)目,都需要多名開發(fā)人員來安裝項(xiàng)目裝置和本地設(shè)置以及運(yùn)行單元測(cè)試的裝置等。

            很多組織都將自己開發(fā)的產(chǎn)品作為Web應(yīng)用程序。我們可以在很多產(chǎn)品中發(fā)現(xiàn)這種情況,例如電子商務(wù)系統(tǒng)、內(nèi)容管理系統(tǒng)(CMS),以及博客發(fā)布平臺(tái)等。這類產(chǎn)品可在多個(gè)服務(wù)器中進(jìn)行部署。對(duì)于成功的多用途W(wǎng)eb應(yīng)用程序來說,他們的開發(fā)人員必須要保證他們的應(yīng)用程序便于安裝,并且能夠與其他Web應(yīng)用程序完美集成。經(jīng)過上述討論之后,我們應(yīng)該明了,作為本文主題的應(yīng)用程序配置是通用Web應(yīng)用程序項(xiàng)目開發(fā)人員所需要解決的重要問題之一。

            諸如CVS或Subversion之類的版本控制系統(tǒng)是開發(fā)組織使用的一種標(biāo)準(zhǔn)工具。這種工具代表了一些組織的中心源代碼版本庫,它們被用于保持源代碼的有序。用戶可以跟蹤應(yīng)用程序源代碼的變化,顯示不同版本的區(qū)別,并可以確定項(xiàng)目分支。而且,它們使得在應(yīng)用程序部署中進(jìn)行部分更新成為可能。

            很明顯,版本控制系統(tǒng)軟件是跟蹤源代碼所必需的,它對(duì)于解決應(yīng)用程序配置問題有非常大的幫助。在本文中,我們將不會(huì)把重點(diǎn)放在版本控制系統(tǒng)上,因?yàn)檫@方面已經(jīng)有很多相關(guān)的材料了。在此,我們將關(guān)注版本控制問題中的一個(gè)小話題:如何使Web應(yīng)用程序的配置更加便捷(尤其是使用Spring MVC框架編寫的Web應(yīng)用程序)。

            問題是:我們?cè)诖擞懻摰氖且环N什么樣的配置?任何Web應(yīng)用程序都需要一些資源,這些資源通常都是其所運(yùn)行的服務(wù)器所特有的,例如數(shù)據(jù)庫URL、發(fā)送電子郵件的SMTP服務(wù)器,以及包含專用軟件文件的文件夾等。這樣的設(shè)置應(yīng)該集中,從而使應(yīng)用程序配置更加簡單。

            但是,這只是這個(gè)問題最簡單的一種版本。有時(shí)候,在應(yīng)用程序開發(fā)中需要更加復(fù)雜的配置。這意味著,必須將各次部署中的不同Bean連接起來,而這會(huì)使問題更加復(fù)雜。

            這些應(yīng)用程序配置問題的解決方案有諸多優(yōu)勢(shì),包括:簡化應(yīng)用程序的安裝和配置過程,使源代碼版本控制更加簡便,減少源代碼版本庫中的沖突現(xiàn)象。下面,我們將通過示例詳細(xì)討論這個(gè)話題。

          問題

            我們首先來演示一下上文所提到的最簡單的版本。在這一場(chǎng)景中,我們希望在應(yīng)用程序部署中改變的是簡單的配置參數(shù),例如鏈接、密碼等。如果您曾經(jīng)使用Spring MVC框架開發(fā)過Web應(yīng)用程序,那么您應(yīng)該知道這里將用到的兩個(gè)配置文件:

          • /WEB-INF/applicationContext.xml,它讓您可以配置Bean,或者顯示應(yīng)用程序上下文。通過這個(gè)文件,您可以定義自己的業(yè)務(wù)邏輯Bean、資源以及其他可以與Web端口相關(guān)聯(lián)的所有Bean。
          • /WEB-INF/[servlet-name]-servlet.xml,它被用于配置Web層、視圖解析器、控制器、校驗(yàn)器以及其他所有MVC框架中必需的Bean。[servlet-name]指的是在web.xml部署描述符中定義的Spring dispatcher servlet的名稱。

            那么問題在哪兒呢?問題就出在applicationContext.xml中將包括一些特定于主機(jī)的Bean定義。其中,最明顯的一個(gè)示例就是包含了JDBC連接信息的bean,但是任何一種稍微復(fù)雜些的應(yīng)用程序都有十幾個(gè)類似的Bean。看一下下面的示例:

          <bean id="dataSource" 
           class="org.springframework.jdbc.datasource.DriverManagerDataSource">
             <property name="driverClassName">
                 <value>org.postgresql.Driver</value>
             </property>
             <property name="url">
                 <value>jdbc:postgresql://localhost/test</value>
             </property>
             <property name="username">
                 <value>postgres</value>
             </property>
             <property name="password">
                 <value></value>
             </property>
          </bean>

            這個(gè)解決方案的問題在于對(duì)applicationContext.xml文件的維護(hù)。對(duì)于初學(xué)者來說,設(shè)想一下,項(xiàng)目放在源代碼版本控制系統(tǒng)中,例如CVS。下面,假設(shè)您希望在網(wǎng)站中添加新的功能,那么就需要在應(yīng)用程序上下文定義中添加額外的Bean定義。問題是如何在生產(chǎn)服務(wù)器上體現(xiàn)這些改變。

            通常情況下,應(yīng)用程序的本地實(shí)例不會(huì)與活動(dòng)站點(diǎn)使用同樣的數(shù)據(jù)庫,因此applicationContext.xml文件將包括讓您能夠訪問本地?cái)?shù)據(jù)庫的設(shè)置。當(dāng)您想提交在源代碼版本庫中的改變時(shí),就需要注意這些特定于主機(jī)屬性的同步性。版本庫中的文件最終可能使用本地設(shè)置中的配置。如果想在生產(chǎn)服務(wù)器上更新配置,就必須手動(dòng)同步這些屬性的值。這是非常枯燥的任務(wù),而且還非常容易出錯(cuò)。

            對(duì)于應(yīng)用程序的每個(gè)實(shí)例來說,這個(gè)問題更加重要。假如有三位開發(fā)人員正在使用代碼段基址,而且他們使用的是本地的數(shù)據(jù)庫。當(dāng)您提交更改的時(shí)候,他們每個(gè)人在本地服務(wù)器上更新源代碼的時(shí)候都必須非常謹(jǐn)慎。他們會(huì)手動(dòng)同步這些更改,然后提交他們的工作。這樣一來,版本控制系統(tǒng)對(duì)于這些配置文件來說已經(jīng)毫無用處。如果曾經(jīng)使用過Spring MVC,那么您應(yīng)該知道applicationContext.xml是應(yīng)用程序中的關(guān)鍵組件,因?yàn)槭撬鼘⑺械臇|西粘合在一起。所以,我們需要一種機(jī)制來幫助使應(yīng)用程序中各項(xiàng)保持有序,這點(diǎn)非常重要。

            正如前面所提到的,這是您可能遇到的較簡單的配置問題。更難的問題出現(xiàn)在當(dāng)需要在不同服務(wù)器中進(jìn)行不同的Bean連接的時(shí)候。這類問題常會(huì)出現(xiàn)在日常軟件開發(fā)任務(wù)中。例如,假如您的產(chǎn)品有一個(gè)客戶身份驗(yàn)證模塊,可以對(duì)來自關(guān)系數(shù)據(jù)庫或LDAP服務(wù)器中的用戶進(jìn)行身份驗(yàn)證。自然,這一身份驗(yàn)證模塊可以使用抽象了特定版本庫的Bean進(jìn)行配置。如果您想改變不同應(yīng)用程序部署中驗(yàn)證用戶的方式,就需要在applicationContext.xml文件中進(jìn)行不同的Bean連接。這種配置問題常見于在部署中有可配置特性的所有應(yīng)用程序。

            在下文中,我們將討論這兩種配置問題。首先我們會(huì)關(guān)注同步的Bean屬性問題及其解決方案,接下來,我們會(huì)討論更加復(fù)雜的同步Bean連接問題。

          解決方案

          同步Bean屬性

            這個(gè)問題的一種可行的解決方案是將所有特定于主機(jī)的參數(shù)都放到普通的Java屬性文件中,使用Spring的PropertyPlaceHolderConfigurer類,將這些參數(shù)寫入Bean屬性中。

            使用這一解決方案,我們可以生成如下的屬性文件(/WEB-INF/jdbc.properties):

          jdbc.driver=org.postgresql.Driver
          jdbc.url=jdbc:postgresql://localhost/test
          jdbc.user=postgres
          jdbc.password=
          

            我們的Bean配置如下:

          <bean id="propertyConfigurer" 
           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
              <property name="location">
                 <value>/WEB-INF/jdbc.properties</value>
              </property>
          </bean>
          
          <bean id="dataSource" 
           class="org.springframework.jdbc.datasource.DriverManagerDataSource">
              <property name="driverClassName">
                   <value>${jdbc.driver}</value>
              </property>
              <property name="url">
                   <value>${jdbc.url}</value>
              </property>
              <property name="username">
                   <value>${jdbc.user}</value>
              </property>
              <property name="password">
                   <value>${jdbc.password}</value>
              </property>
          </bean>

            如上所述,我們定義了一個(gè)PropertyPlaceholderConfigurer類的實(shí)例,并將其位置屬性設(shè)置為我們的屬性文件。該類被實(shí)現(xiàn)為Bean工廠的后處理器,并將使用定義在文件中的屬性來代替所有的占位符(${...}value)。

            利用這種技術(shù),我們可以從applicationContext.xml中移除所有特定于主機(jī)的配置屬性。通過這種方式,我們可以自由地為該文件添加新的Bean,而不必?fù)?dān)心特定于主機(jī)屬性的同步性。這樣可以簡化生產(chǎn)部署和維護(hù)。

          同步性連接

            上面的技術(shù)解決了第一個(gè)問題,可是如果您計(jì)劃修改不同應(yīng)用程序部署之間的Bean連接,這一技術(shù)便不很適合。針對(duì)這一問題的一個(gè)解決方案便是額外創(chuàng)建一個(gè)名為applicationContext-[hostname].xml 的XML定義文件。其中[hostname]是部署應(yīng)用程序的主機(jī)的名稱。例如,在本地的機(jī)器上,這個(gè)文件通常名為applicationContext-localhost.xml,而在部署時(shí),它可能更名為applicationContext-somehost.com.xml。

            可以猜測(cè),這一文件必須包括特定于某一主機(jī)的所有配置Bean。在本文中,我們將假設(shè)dataSource bean定義將位于這類文件中,而不是通用的applicationContext.xml定義。當(dāng)然,這種機(jī)制與前者并非沖突,但是為了更加簡單明了,我們將只關(guān)注這種方法。

            既然我們已經(jīng)有了特定的配置,下面我們就來討論一下如何將其整合到整個(gè)Spring MVC配置概念中。要達(dá)到這一目的,可以有許多方法,我們將詳細(xì)地一一說明。但首先,我們應(yīng)該注意到,由于有些Bean可能位于獨(dú)立的配置文件中,因此在applicationContext.xml中,所有對(duì)它們的局部引用都必須更換成全局名稱。

            例如,如下引用:

           <property name="someProperty">
             <ref local="someBean"/>
           </property>

            應(yīng)更改為:

           <property name="someProperty">
             <ref bean="someBean"/>
           </property>

            在這之后,我們有很多可以添加額外的資源以用于配置的方式。其中最明顯的就是使用<import>標(biāo)簽將這一額外資源包含在applicationContext.xml配置文件中。使用時(shí),要將該標(biāo)簽放在applicationContext.xml文件開頭。例如:

          <import resource="applicationContext-somehost.com.xml"/> 

            現(xiàn)在,在獨(dú)立的XML定義文件和普通的應(yīng)用程序上下文定義文件中的所有通用Bean定義都有了特定于主機(jī)的連接。由于大多數(shù)的Bean都不是特定于主機(jī)的,因此我們可以像處理Web應(yīng)用程序中的其他資源一樣自由地處理applicationContext.xml文件,并可以通過合適的版本控制系統(tǒng)與其進(jìn)行同步。

            但是,上述方法也有一定的弊端。如果您想保留不同XML文件的不同配置,就仍然必須擔(dān)心applicationContext.xml的同步性,因?yàn)橘Y源的名稱必須根據(jù)不同服務(wù)器進(jìn)行更改。雖然與原有的解決方案相比有了很大提高,只需更改文件名,但是這還是需要開發(fā)人員的手動(dòng)協(xié)助。

            由于與applicationContext.xml相比,主機(jī)配置不需如此頻繁地進(jìn)行更改,因此下一步便是將主機(jī)配置移動(dòng)到web.xml文件中(如果可能的話)。幸運(yùn)的是,我們有一個(gè)可用的解決方案。看一下下面關(guān)于web.xml配置的片斷:

          <listener>
             <listener-class>
              org.springframework.web.context.ContextLoaderListener
             </listener-class>
            </listener>
            <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>
              /WEB-INF/applicationContext.xml 
                 /WEB-INF/applicationContext-somehost.com.xml
              </param-value>
            </context-param>

            正如您所看到的,除了web.xml文件中常有的ContextLoaderListener之外,我們還添加了contextConfigLocation上下文參數(shù)配置。這一參數(shù)用于指示框架查找這些配置文件的位置。如果這一參數(shù)被省略,則Spring就只能到applicationContext.xml中查找。這里我們也定義了特定于主機(jī)的配置文件來使用。

            利用這種方法,我們將所有特定于主機(jī)的配置從applicationContext.xml文件中移除,這樣便減輕了其在不同應(yīng)用程序部署中的同步性。

            如果這種方法成為您的新習(xí)慣,您還可以使其更加靈活。通過遵守下列指令,也可以將特定于主機(jī)的配置從web.xml文件中移除。

            為此,需要?jiǎng)?chuàng)建特定于我們的應(yīng)用程序上下文的類:

          package net.nighttale.spring.util;
          
          import java.net.InetAddress;
          
          import org.springframework.web.context.support.XmlWebApplicationContext;
          
          public class PerHostXmlWebApplicationContext 
           extends XmlWebApplicationContext {
                  
              protected String[] getDefaultConfigLocations() {
                      String hostname = "localhost";
                      try {
                          hostname = InetAddress.getLocalHost().getHostName();
                      } catch (Exception e) {
                      }
                      
                      String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX 
                           + "applicationContext-" 
                           + hostname 
                           + DEFAULT_CONFIG_LOCATION_SUFFIX
                           ;
              
                      logger.debug(
                           "Adding per host configuration file: " 
                           + perHostConfiguration
                           );
                      
                      if (getNamespace() != null) {
                              return new String[] {
                        DEFAULT_CONFIG_LOCATION_PREFIX 
                          + getNamespace() 
                          + DEFAULT_CONFIG_LOCATION_SUFFIX
                       , perHostConfiguration};
                      }
                      else {
                              return new String[] {
                       DEFAULT_CONFIG_LOCATION
                        , perHostConfiguration};
                      }
              }
          }
          

            這個(gè)類拓展了Spring中常被作為默認(rèn)值使用的XmlWebApplicationContext。XmlWebApplicationContext類將Web應(yīng)用程序的配置從XML定義文件中復(fù)制過來。默認(rèn)情況下,它可以配置來自applicationContext.xml和[servlet-name]-servlet.xml文件中的應(yīng)用程序。這個(gè)類執(zhí)行的惟一一項(xiàng)額外任務(wù)便是獲取它所在的主機(jī)名稱,并將applicationContext-[hostname].xml文件添加到配置文件列表中。

            為了使用這個(gè)類,我們需要對(duì)其進(jìn)行編譯,將其包含在類途徑中,并指示Spring框架使用它。前兩步非常簡單,我們就不在此贅述。我們可以指示Sping通過contextClass上下文參數(shù)來使用它。除了web.xml文件中的原有配置,我們還可以添加下列內(nèi)容:

          <context-param>
             <param-name>contextClass</param-name>
            <param-value>
             net.nighttale.spring.util.PerHostXmlWebApplicationContext
            </param-value>
          </context-param>

            如果我們使用這一配置片斷,將會(huì)有三個(gè)文件被用于初始化這個(gè)框架:[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xml。

            正如您所看到的,applicationContext.xml和web.xml文件已經(jīng)完全擺脫了任何特定的配置細(xì)節(jié),而且您也不必?fù)?dān)心會(huì)在更新應(yīng)用程序時(shí)破壞配置。

            但是,這種方法有一個(gè)不足之處。因?yàn)椋徽撌欠駮?huì)使用,都需要在應(yīng)用程序部署中有第三個(gè)配置文件。在這種情況下,便不需要特定于主機(jī)的配置。例如:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
              "http://www.springframework.org/dtd/spring-beans.dtd">
          
          <beans></beans>

            最后,需要知道應(yīng)用程序上下文類需要查找的特定主機(jī)名。檢查主機(jī)名稱的最簡單的方法是在機(jī)器上運(yùn)行下列代碼:

          System.out.println(InetAddress.getLocalHost().getHostName())

            可以將其作為Java代碼執(zhí)行,也可在喜歡使用的腳本語言(如BeanShell或Groovy)中作為一個(gè)具有Java風(fēng)格語法的腳本執(zhí)行。在獲取了主機(jī)的名稱之后,應(yīng)該創(chuàng)建一個(gè)默認(rèn)的/WEB-INF/applicationContext-[hostname].xml空文件夾(如我們上面所定義的),然后便可以開始了。

          結(jié)束語

            在本文中,我們提供了一系列的配置技巧,讓您在使用Spring MVC框架完成日常工作的時(shí)候更加輕松。如果您希望知道如何維護(hù)各種Web應(yīng)用程序部署,可以試著找出最適合您的開發(fā)過程的解決方案。您的生活會(huì)更為輕松。

          posted @ 2006-07-09 11:18 虎嘯龍吟 閱讀(309) | 評(píng)論 (0)編輯 收藏
          ???????? 最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯(cuò)。就是入門了點(diǎn)。Manning的書還是不錯(cuò)的,我雖然不像哪些只看Manning書的人那樣專注于Manning,但懷著崇敬的心情和激情通覽了一遍。又一次接受了IOC 、DI、AOP等Spring核心概念。 先就IOC和DI談一點(diǎn)我的看法。

          IOC(DI):其實(shí)這個(gè)Spring架構(gòu)核心的概念沒有這么復(fù)雜,更不像有些書上描述的那樣晦澀。java程序員都知道:java程序中的每個(gè)業(yè)務(wù)邏輯至少需要兩個(gè)或以上的對(duì)象來協(xié)作完成,通常,每個(gè)對(duì)象在使用他的合作對(duì)象時(shí),自己均要使用像new object() 這樣的語法來完成合作對(duì)象的申請(qǐng)工作。你會(huì)發(fā)現(xiàn):對(duì)象間的耦合度高了。而IOC的思想是:Spring容器來實(shí)現(xiàn)這些相互依賴對(duì)象的創(chuàng)建、協(xié)調(diào)工作。對(duì)象只需要關(guān)系業(yè)務(wù)邏輯本身就可以了。從這方面來說,對(duì)象如何得到他的協(xié)作對(duì)象的責(zé)任被反轉(zhuǎn)了(IOC、DI)。

          這是我對(duì)Spring的IOC的體會(huì)。DI其實(shí)就是IOC的另外一種說法。DI是由Martin Fowler 在2004年初的一篇論文中首次提出的。他總結(jié):控制的什么被反轉(zhuǎn)了?就是:獲得依賴對(duì)象的方式反轉(zhuǎn)了。

          如果對(duì)這一核心概念還不理解:這里引用一個(gè)叫Bromonblog上找到的淺顯易懂的答案:



          IoCDI

            首先想說說IoCInversion of Control,控制倒轉(zhuǎn))。這是spring的核心,貫穿始終。所謂IoC,對(duì)于spring框架來說,就是由spring來負(fù)責(zé)控制對(duì)象的生命周期和對(duì)象間的關(guān)系。這是什么意思呢,舉個(gè)簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪里有長得漂亮身材又好的mm,然后打聽她們的興趣愛好、qq號(hào)、電話號(hào)、ip號(hào)、iq號(hào)………,想辦法認(rèn)識(shí)她們,投其所好送其所要,然后嘿嘿……這個(gè)過程是復(fù)雜深?yuàn)W的,我們必須自己設(shè)計(jì)和面對(duì)每個(gè)環(huán)節(jié)。傳統(tǒng)的程序開發(fā)也是如此,在一個(gè)對(duì)象中,如果要使用另外的對(duì)象,就必須得到它(自己new一個(gè),或者從JNDI中查詢一個(gè)),使用完之后還要將對(duì)象銷毀(比Connection等),對(duì)象始終會(huì)和其他的接口或類藕合起來。

            那么IoC是如何做的呢?有點(diǎn)像通過婚介找女朋友,在我和女朋友之間引入了一個(gè)第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個(gè)列表,告訴它我想找個(gè)什么樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術(shù)像齊達(dá)內(nèi)之類的,然后婚介就會(huì)按照我們的要求,提供一個(gè)mm,我們只需要去和她談戀愛、結(jié)婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會(huì)拋出異常。整個(gè)過程不再由我自己控制,而是有婚介這樣一個(gè)類似容器的機(jī)構(gòu)來控制。Spring所倡導(dǎo)的開發(fā)方式就是如此,所有的類都會(huì)在spring容器中登記,告訴spring你是個(gè)什么東西,你需要什么東西,然后spring會(huì)在系統(tǒng)運(yùn)行到適當(dāng)?shù)臅r(shí)候,把你要的東西主動(dòng)給你,同時(shí)也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由 spring來控制,也就是說控制對(duì)象生存周期的不再是引用它的對(duì)象,而是spring。對(duì)于某個(gè)具體的對(duì)象而言,以前是它控制其他對(duì)象,現(xiàn)在是所有對(duì)象都被spring控制,所以這叫控制反轉(zhuǎn)。如果你還不明白的話,我決定放棄。

          IoC的一個(gè)重點(diǎn)是在系統(tǒng)運(yùn)行中,動(dòng)態(tài)的向某個(gè)對(duì)象提供它所需要的其他對(duì)象。這一點(diǎn)是通過DIDependency Injection,依賴注入)來實(shí)現(xiàn)的。比如對(duì)象A需要操作數(shù)據(jù)庫,以前我們總是要在A中自己編寫代碼來獲得一個(gè)Connection對(duì)象,有了 spring我們就只需要告訴springA中需要一個(gè)Connection,至于這個(gè)Connection怎么構(gòu)造,何時(shí)構(gòu)造,A不需要知道。在系統(tǒng)運(yùn)行時(shí),spring會(huì)在適當(dāng)?shù)臅r(shí)候制造一個(gè)Connection,然后像打針一樣,注射到A當(dāng)中,這樣就完成了對(duì)各個(gè)對(duì)象之間關(guān)系的控制。A需要依賴 Connection才能正常運(yùn)行,而這個(gè)Connection是由spring注入到A中的,依賴注入的名字就這么來的。那么DI是如何實(shí)現(xiàn)的呢? Java 1.3之后一個(gè)重要特征是反射(reflection),它允許程序在運(yùn)行的時(shí)候動(dòng)態(tài)的生成對(duì)象、執(zhí)行對(duì)象的方法、改變對(duì)象的屬性,spring就是通過反射來實(shí)現(xiàn)注入的。關(guān)于反射的相關(guān)資料請(qǐng)查閱java doc


          如果還不明白,放棄java吧!



          posted @ 2006-04-12 10:34 虎嘯龍吟 閱讀(890) | 評(píng)論 (5)編輯 收藏
          如題。但 blogjava系統(tǒng)為何用.net開發(fā)
          posted @ 2006-04-02 18:39 虎嘯龍吟 閱讀(237) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊(cè)

          友情鏈接

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 油尖旺区| 孟连| 南汇区| 冀州市| 永泰县| 宁夏| 龙陵县| 松溪县| 八宿县| 上高县| 巴塘县| 定结县| 金平| 墨江| 西贡区| 沁水县| 凌源市| 宜丰县| 宜君县| 祥云县| 泌阳县| 安达市| 东港市| 房产| 伽师县| 大邑县| 灌南县| 高碑店市| 疏附县| 颍上县| 吉木萨尔县| 阿拉善右旗| 玉田县| 小金县| 顺义区| 文水县| 沈丘县| 广南县| 周至县| 尉犁县| 玉龙|