国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

PASX簡化Java開發

2019-11-18 12:27:50
字體:
來源:轉載
供稿:網友

  你是否曾經編寫了一個程序,卻在復檢的時候發現它的配置過程很不合理?你是否曾經使用過配置文件,卻發現它們不能滿足描述應用程序的需要?你是否為了解決幾個非凡問題而創建過臨時配置補丁,卻把花費更多時間、開發普遍適用方案的希望寄托到了未來?
  
  假如你的回答是肯定的,那么,你和大多數其他java程序員一樣幸運,有一些工具能夠幫助你解決這些問題。假如你的回答是否定的,關于屬性文件局限的討論也許能夠讓你信服——還有更好的方法可供使用。
  
  屬性文件是Java編程和運行環境的一個重要組成部分。然而,當一個程序員需要的功能遠遠超過PRoperties類提供的簡單名字-值對時,他需要有更豐富的表現手法。通常,Java程序員擴展屬性文件的方法是為屬性本身的名字或值(或兩者同時)增加額外的語義信息。很多時候,這種看來有效的方法會使問題越來越復雜。
  
  為說明問題,請利用屬性把一系列的值賦給單個名字。讓我們假定你想要治理一組名稱服務器,可能采用的屬性文件內容如下:
  
  hosts_1=ns.foo.com
  hosts_2=ns.bar.com
  hosts_3=ns.acme.com
  
  代碼很簡單。改變名字-值對中名字的含義之后,你可以輕松地編寫出把“hosts_”開頭的名字當成“hosts”列表中一個元素的程序。
  
  下面,我們來看看一個更復雜的例子。假設你有同一Bean類InternetHost的兩個不同實例:實例A關聯到一個Web服務器的列表;實例B關聯到一個名稱服務器的列表。要從同一個文件配置這兩個實例,一種可能的方案如下:
  
  name_hosts_1=ns.foo.com
  name_hosts_2=ns.bar.com
  name_hosts_3=ns.acme.com
  web_hosts_1=www.foo.com
  web_hosts_2=www.bar.com
  web_hosts_3=www.acme.com
  
  這種方法行得通,但總是給人以拼拼湊湊的感覺。假如你還不相信的話,稍微增加一點問題的復雜性:讓這些列表中的某個元素自己也成為一個列表;或者,使得下劃線字符(“_”)在名字-值對中合法。在這些情況下,簡單的屬性文件變得非常復雜。
  
  作為一個細心的讀者,你可能已經發現,InternetHost各個實例的命名方式逐漸模糊。為了把前三個屬性賦值給實例A,把后三個屬性賦值給實例B,你必須用某種與具體實例無關的方法告訴實例它們該用哪一組屬性值。假如用直接編碼的方式,讓實例A尋找以“name_”開頭的屬性,讓實例B尋找以“Web_”開頭的屬性,那么,這兩個實例將不再屬于同一對象類。
  
  最后的例子還顯示出另外一個問題。這就是,如何來調用實例A?簡單地叫它“A”?到哪里去尋找它?它是本地實例還是遠程接口?是否存在指向它的全局靜態引用?如是,如何訪問實例B(或者,那是否是“B”)?
  
  解決這些問題的方案是使用一個組件配置和命名框架。有許多工具能夠幫助你完成這個任務,其中之一就是PASX。PASX是一個源代碼開放的Java工具,它通過xml進行配置,通過JNDI實現命名。PASX框架用XML配置用戶定義的服務、JNDI名稱空間、JDBC連接池、事件樹、工作隊列和系統日志。
  
  PASX利用XML進行配置,因為XML比簡單的屬性列表具有更豐富的描述能力。為了理解為何XML更適合完成這類任務,請再次考慮第一個例子。假如用PASX定義的標記重新描述,則結果應該如下:
  
  <List>
  <String>ns.foo.com</String>
  <String>ns.bar.com</String>
  <String>ns.acme.com</String>
  </List>
  
  雖然代碼更加冗長,但它的含義比原來要清楚得多。由于一些列表可能被排序,元素在XML文檔中出現的次序決定了它們在最終數據結構中的次序。屬性文件最終用來構造Properties對象,它的名字必須指示出元素的索引,因為Properties對象直接從Hashtable派生得到。
  
  用XML描述時,第二個屬性示例如下所示:
  
  <List name="name-servers">
  <String>ns.foo.com</String>
  <String>ns.bar.com</String>
  <String>ns.acme.com</String>
  </List>
  <List name="web-servers">
  <String>www.foo.com</String>
  <String>www.bar.com</String>
  <String>www.acme.com</String>
  </List>
  
  還記得示例二之后提出的難題嗎?讓列表中的某個元素成為一個子列表,讓其中一個列表成為元素名字可以包含下劃線的映射結構。下面是它的答案:
  
  <List name="name-servers">
  <String>ns.foo.com<String>
  <List>
  <String>ns1.bar.com</String>
  <String>ns2.bar.com</String>
  </List>
  <String>ns.acme.com</String>
  </List>
  <Map name="web-servers">
  <String name="most_visited">www.foo.com<String>
  <String name="most_bytes">www.bar.com</String>
  </Map>
  
  在PASX中,組件(一個類或者一組有著密切關系的類)是實現PASXService接口的Java Bean。它們由XML <Service>標記定義,這個標記用來命名組件的單個實例。賦予實例“A”名稱服務器列表以及賦予實例“B”Web服務器列表的XML代碼如下所示:
  
  <Service name="A" class="my.InternetHost">
  <List name="hosts">
  <String>ns.foo.com</String>
  <String<ns.bar.com</String>
  <String<ns.acme.com</String>
  </List>
  </Service>
  <Service name="B" class="my.InternetHost">
  <List name="hosts">
  <String>web.foo.com</String>
  <String>web.bar.com</String>
  <String>web.acme.com</String>
  </List>
  </Service>
  
  PASX定義了一系列的標準XML標記,用來聲明List、Map、Integer、String、Boolean等類型的屬性。然而,PASXService類還可以經由名稱空間和XML模式使用它自己的XML標記。XML模式答應組件開發者定義自己的標記,答應XML解析器驗證PASX所定義標記和組件開發者所定義標記的合法性。下面的示例模式定義了一個<Server>標記,它必須有hostName和portNumber屬性。<Server>標記必須作為<Cluster>標記的子元素至少出現一次,但可以出現多次。<Cluster>標記必須作為<ServerFarm>標記的子元素出現至少一次,但可以出現多次。
  
  <?xml version="1.0"?>
  <schema xmlns="http://www.w3.org/2000/10/XMLSchema"
  xmlns:pce="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  targetNamespace="http://pasx.org/PASX/CUSTOM-EXAMPLE" elementFormDefault="qualified" >
  
  <annotation>
  <documentation>
  A custom schema example to be using with PASX (PCE)
  </documentation>
  </annotation>
  
  <element name="Server">
  <complexType content="empty">
  <attribute
  name="hostName"
  use="required"
  type="string"/>
  <attribute
  name="portNumber"
  use="required"
  type="positiveInteger"/>
  </complexType>
  </element>
  
  <element name="Cluster">
  <complexType>
  <sequence>
  <element
  ref="pce:Server" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  <attribute
  name="name"
  use="required"
  type="string"/>
  </complexType>
  </element>
  
  <element name="ServerFarm">
  <complexType>
  <sequence>
  <element
  ref="pce:Cluster" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  <attribute
  name="name"
  use="required"
  type="string"/>
  </complexType>
  </element>
  
  <element name="PCE">
  <complexType>
  <sequence>
  <element
  ref="pce:ServerFarm" minOccurs="1" maxOccurs="unbounded"/>
  </sequence>
  </complexType>
  </element>
  
  </schema>
  
  
  具體介紹XML模式文檔(XSD)的構造方法已經超出了本文的范圍。重要的是必須熟悉到,PASXService組件的開發者可以使用一組定制標記。更妙的是,開發者無需編寫任何驗證代碼,就可以確保XML不僅格式良好而且合法(這一切由解析器完成)。下面聲明的<Service>標記用到了前面的模式:
  
  <Service
  class="org.pasx.examples.CustomConfigExample"
  name="examples.customConfigExample" >
  
  <pce:PCE xmlns="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  xmlns:pce="http://pasx.org/PASX/CUSTOM-EXAMPLE"
  xsi:schemaLocation="http://pasx.org/PASX/CUSTOM-EXAMPLE /org/pasx/examples/custom-example.xsd" >
  
  <ServerFarm name="farm0">
  <Cluster name="cluster0">
  <Server hostName="app0.foo.com" portNumber="8080" />
  <Server hostName="app1.foo.com" portNumber="8080" />
  </Cluster>
  <Cluster name="cluster1">
  <Server hostName="app2.foo.c

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平舆县| 宝山区| 鹤庆县| 井冈山市| 云霄县| 哈巴河县| 昌都县| 集贤县| 乐东| 玉龙| 景洪市| 德惠市| 会同县| 五河县| 东阿县| 桂东县| 县级市| 桓台县| 凤庆县| 阜新市| 岳池县| 怀来县| 贡觉县| 新巴尔虎右旗| 黔西| 特克斯县| 五家渠市| 武冈市| 军事| 花莲市| 霍州市| 江陵县| 宜兰市| 大庆市| 周至县| 岳阳县| 兴宁市| 墨江| 贡嘎县| 平果县| 洛川县|