SCA Assembly Model Specification V1.0.0 中文翻译(四)

日期: 2008-05-28 作者:liang_ma 来源:TechTarget中国

  此部分描述SCA组装模型规范–1.6 构件(Composite)与1.6.1 属性(Property).一个SCA构件以逻辑分组的方式来组装SCA元素,它是一个SCA域里组合(composition)的基本单元。一个SCA 构件是一个集合,它包含组件、服务、引用以及连接它们的连线,还有一个被用来配置组件的属性集。。。


  1.6 构件(composite)


  一个SCA构件以逻辑分组的方式来组装SCA元素,它是一个SCA域里组合(composition)的基本单元。一个SCA 构件是一个集合,它包含组件、服务、引用以及连接它们的连线,还有一个被用来配置组件的属性集。


  构件可以在高层次的构件中形成组件实现(component implementations),即构件可以作为组件来使用。换句话说,高层次的构件可以有这样的组件,它是由构件实现的。关于构件作为组件实现的使用的更多细节参见Using Composites as Component Implementations。


  构件的内容可以通过inclusion在另一个构件里使用。当一个构件(如A)被其它构件(如B)包括(include)时,A的所有内容都可以在构件B中使用,也就是说,在构件B里,A的内容是完全可见的且可以被其它元素引用。参见Using Composites through Inclusion。


  构件可以被用来作为一个部署单元。当使用的时候,构件把元素贡献给一个SCA域。一个构件可以通过inclusion被部署到SCA域,或者作为一个实现被部署到SCA域。更多关于构件部署的细节参见处理SCA Domain的部分。


  构件在一个xxx.composite文件中定义。构件通过一个composite元素表示。下面的代码片段展示了composite元素的模式(schema)。


  <?xml version=”1.0″ encoding=”ASCII”?>
  <!– Composite schema snippet –>
  <composite http://www.osoa.org/
                  name=”xs:NCName” local=”xs:boolean”?
                  autowire=”xs:boolean”? constrainingType=”QName”?
                  requires=”list of xs:QName”? policySets=”list of xs:QName”?>
 
      <include name=”xs:QName”/>*
      <service name=”xs:NCName” promote=”xs:anyURI”
                  requires=”list of xs:QName”? policySets=”list of xs:QName”?>*
            <interface/>?
            <binding uri=”xs:anyURI”? name=”xs:QName”?
                        requires=”list of xs:QName”? policySets=”list of xs:QName”?/>*
                   <callback>?
                         <binding uri=”xs:anyURI”? name=”xs:QName”?
                                          requires=”list of xs:QName”?
                                          policySets=”list of xs:QName”?/>+
                    </callback>
        </service>
 
        <reference name=”xs:NCName” target=”list of xs:anyURI”?
                            promote=”list of xs:anyURI” wiredByImpl=”xs:boolean”?
                            multiplicity=”0..1 or 1..1 or 0..n or 1..n”?
                        requires=”list of xs:QName”? policySets=”list of xs:QName”?>*
                <interface/>?
                <binding uri=”xs:anyURI”? name=”xs:QName”?
                             requires=”list of xs:QName”? policySets=”list of xs:QName”?/>*
                       <callback>?
                              <binding uri=”xs:anyURI”? name=”xs:QName”?
                                               requires=”list of xs:QName”?
                                               policySets=”list of xs:QName”?/>+
                      </callback>
        </reference>
 
       <property name=”xs:NCName” (type=”xs:QName” | element=”xs:QName”)
                         many=”xs:boolean”? mustSupply=”xs:boolean”?>*
              default-property-value?
       </property>
 
       <component name=”xs:NCName” autowire=”xs:boolean”?
                           requires=”list of xs:QName”? policySets=”list of xs:QName”?>*
              <implementation/>?
              <service name=”xs:NCName” requires=”list of xs:QName”?
                              policySets=”list of xs:QName”?>* 
                       <interface/>?
                       <binding uri=”xs:anyURI”? name=”xs:QName”?
                                         requires=”list of xs:QName”?
                                         policySets=”list of xs:QName”?/>*
                        <callback>?
                                 <binding uri=”xs:anyURI”? name=”xs:QName”?
                                                  requires=”list of xs:QName”?
                                                  policySets=”list of xs:QName”?/>+
                        </callback>
               </service>
               <property name=”xs:NCName” (type=”xs:QName” | element=”xs:QName”)
                                 source=”xs:string”? file=”xs:anyURI”?>*
                       property-value
              </property>
              <reference name=”xs:NCName” target=”list of xs:anyURI”?
                                  autowire=”xs:boolean”? wiredByImpl=”xs:boolean”?
                                  requires=”list of xs:QName”? policySets=”list of xs:QName”?
                                  multiplicity=”0..1 or 1..1 or 0..n or 1..n”?/>*
                    <interface/>?
                    <binding uri=”xs:anyURI”? name=”xs:QName”?
                                     requires=”list of xs:QName”?
                                     policySets=”list of xs:QName”?/>*
                    <callback>?
                            <binding uri=”xs:anyURI”? name=”xs:QName”?
                                             requires=”list of xs:QName”?
                                             policySets=”list of xs:QName”?/>+
                   </callback>
              </reference> 
     </component>
 
     <wire source=”xs:anyURI” target=”xs:anyURI” />*
 
</composite>


  composite元素有下列属性(attributes):


  name(必需):构件的名称。其形式是一个XML QName,在命名空间中由        targetNamespace属性标识。


  targetNamespace(可选):构件被声明的目标命名空间中的一个标识符。


  local(可选):此构件里的所有组件是否都必须运行在同一个操作系统进程里。值为true,表示必须运行在同一操作系统进程里。默认为false,表示此构件里的不同组件可以运行在不同的操作系统进程里,甚至可以运行在网络中的不同节点。


  autowire(可选):构件所包含的组件引用是否应该被自动连线,参见the Autowire section. 默认是false。


  constrainingType(可选):contrainingType的名字。指定后,构件的服务、引用、属性还有相关意图都要受到constrainingType定义的约束。参见the ConstrainingType Section。


  requires(可选):策略意图列表。参见Policy Framework specification[10].


  policySets(可选):策略集列表。参见Policy Framework specification[10].


  构件(composites)包含0个或多个properties、services、components、references、wires和included composites。这些部件在下面的部分详细描述。


  组件(components)包含可配置的实现,它掌握着构件的业务逻辑。组件提供服务,并且需要对其它服务的引用。构件服务(composite services)定义了由构件提供的公共服务,这些服务可以从构件的外面被访问。构件引用(composite references)代表着构件对它外部其它地方提供服务的依赖。连线(wires)描述构件里的组件服务和组件引用之间的联系。被包含进来的构件(included composites)把它们包含的元素贡献给使用它的构件。


  构件服务(composite services)包括构件里的某个组件的一个服务的提升(promotion)。这意味着构件的服务实际上是由它里面的组件之一提供的。构件引用包括1个或多个引用的提升,这些引用来自1个或多个组件。多个组件引用可以被提升为相同的构件引用,只要所有的组件引用彼此是兼容的,在这种情况下,这些组件引用都可以共享相同的配置,包括相同的目标服务。


  构件服务和构件引用可以各自使用它们提升的服务以及引用的配置(比如Bindings和Policy Sets)。通过构件服务或引用的binidngs及其它方面的配置,它们也可以覆盖被提升的服务及引用的部分或所有配置。


  组件服务和组件引用可以被提升为构件服务和构件引用,同时也可以在构件内被连线。对于一个引用,这一点仅在此引用的multiplicity属性值大于1时才有意义。


  1.6.1 属性(property)-定义和配置


  属性(properties)允许在实现的外面设定数据的值。一个实现(implementation),也包括构件,可以声明0个或多个属性。每一个属性有一个类型,类型可以是简单的也可以是复杂的。实现也可以为属性定义一个默认值。属性可以在使用此实现的组件里用值来配置。


  构件里一个属性的声明可以遵循下面代码描述的格式:


  <?xml version=”1.0″ encoding=”ASCII”?>
 
  <composite http://www.osoa.org/ … >
 …
       <property name=”xs:NCName” (type=”xs:QName” | element=”xs:QName”)
                         many=”xs:boolean”? mustSupply=”xs:boolean”?>*
              default-property-value?
       </property>
  …
  </composite>


  property元素有下列属性:
 
  name(必需):属性的名字。


  type、element之一(必需):


  type,属性的类型,是一个XML模式类型的限定名。


  element,属性的类型,它是一个全局element。


  many(可选):属性是否是单值(false)或多值(true)的。默认是false,在多值的情况下,属性的值在实现里被表示为一个集合类(Collection)。


  mustSupply(可选):此值表示属性的值是否由使用此实现的组件提供。当mustSupply为“true”是,组件必须提供一个值,因为实现没有为属性提供默认值。仅当mustSupply=“false”时,实现应该提供一个默认属性值(default-property-value)。此属性默认为false,意味着这个值不被使用它的组件提供。


  property元素可以包含一个可选的default-property-value,它提供了此property的默认值。这个默认值必须匹配property声明的类型:


  一个字符串,如果type是一个简单的类型(必须匹配声明的type)


  一个复杂类型的值,同样要匹配type的声明


  一个元素,匹配名称为element的元素


  多个值,如果many=“true”


  不同于构件,实现类型能够以一个实现依赖(implementation-dependent)的形式(比如Java类里的注解)声明属性,或通过componentType文件里的属性声明的形式来声明,componentType文件的形式已在上面描述。


  当一个实现被组件使用的时候,property的值可以被配置。the section on Components展示了property配置的形式。


  1.6.1.1 property举例


  下面的例子展示了属性声明和值设定,接下来的例子是一个复杂类型的使用:


  <xsd:schema http://www.w3.org/2001/XMLSchema”>http://www.w3.org/2001/XMLSchema”
                         targetNamespace=”http://foo.com/
                         http://foo.com/”>http://foo.com/“>
  <!– ComplexProperty schema –>
  <xsd:element name=”fooElement” type=”MyComplexType”/>
  <xsd:complexType name=”MyComplexType”>
          <xsd:sequence>
                  <xsd:element name=”a” type=”xsd:string”/>
                  <xsd:element name=”b” type=”anyURI”/>
          </xsd:sequence>
          <attribute name=”attr” type=”xsd:string” use=”optional”/>
  </xsd:complexType>
  </xsd:schema>


  下面的构件展示了一个复杂类型的属性声明,带有一个默认值,它还展示了一个复杂类型的属性值在组件里的设定:


  <?xml version=”1.0″ encoding=”ASCII”?>
 
  <composite http://www.osoa.org/http://foo.com”>http://foo.com”
                       targetNamespace=”http://foo.com
                       name=”AccountServices”>
  <!– AccountServices Example1 –>
  …
      <property name=”complexFoo” type=”foo:MyComplexType”>
             <MyComplexPropertyValue xsi_type=”foo:MyComplexType”>
                   <foo:a>AValue</foo:a>
                   <foo:b>InterestingURI</foo:b>
              </MyComplexPropertyValue>
     </property>
 
     <component name=”AccountServiceComponent”>
             <implementation.java class=”foo.AccountServiceImpl”/>
             <property name=”complexBar” source=”$complexFoo”/>
             <reference name=”accountDataService”
                                 target=”AccountDataServiceComponent”/>
             <reference name=”stockQuoteService”   target=”StockQuoteService”/>
     </component>
  …
  </composite>


  在构件AccountService里名字为complexFoo的属性声明中,属性定义为类型foo:MyComplexType。命名空间foo在构件里声明,它引用了XSD,XSD是MyComplexType定义的地方。complexFoo的声明包含了一个默认值。它被作为property元素的内容声明。在这个例子中,默认值由foo:MyComplexType的MyComplexPropertyValue元素,以及它的两个子元素<foo:a>和<foo:b>组成,默认值在MyComplexType的定义之后被声明。


  在组件AccountServiceComponent中,组件设定了属性complexBar的值,这个属性在组件配置的实现(implementation)中声明。在这种情况下,complexBar的类型是foo:MyComplextype。例子表明,属性complexBar的值被属性complexFoo的值设定,名字为complexBar的property元素的source属性表明,这个property的值由构件中包含的property的值设定。source属性的值是$complexFoo,这里complexFoo是构件中的property的名字。这个值意味着,源property的所有值都用来设定组件中property的值。


  下面的例子说明了,一个简单类型(如String)的property的值可以设定为一个构件中的复杂类型属性的部分属性值:


  <?xml version=”1.0″ encoding=”ASCII”?>
 
  <composite http://www.osoa.org/http://foo.com”>http://foo.com”
                       targetNamespace=”http://foo.com
                       name=”AccountServices”>
  <!– AccountServices Example2 –>
  …
      <property name=”complexFoo” type=”foo:MyComplexType”>
               <MyComplexPropertyValue xsi_type=”foo:MyComplexType”>
                         <foo:a>AValue</foo:a>
                         <foo:b>InterestingURI</foo:b>
               </MyComplexPropertyValue>
      </property>
 
      <component name=”AccountServiceComponent”>
              <implementation.java class=”foo.AccountServiceImpl”/>
              <property name=”currency” source=”$complexFoo/a”/>
              <reference name=”accountDataService”
                                     target=”AccountDataServiceComponent”/>
              <reference name=”stockQuoteService”   target=”StockQuoteService”/>
      </component>
    …
      </composite>


  在这个例子中,组件AccountServiceComponent设定了名为currency 属性 的值,它的是String类型。这个值由构件AccountServices的一个属性值设定的,通过source属性的值$complexFoo/a。这是一个XPath表达式,它选择了名为complexFoo属性中子元素a的值。“a”子元素是一个String,与currency属性的类型相匹配。


  进一步的例子展示了组件中声明属性及设定属性值:


  类型为简单类型且有默认值的属性声明:


  <property name=”SimpleTypeProperty” type=”xsd:string”>
              MyValue
        </property> 


  类型为复杂类型且有默认值的属性声明:


  <property name=”complexFoo” type=”foo:MyComplexType”>
      <MyComplexPropertyValue xsi_type=”foo:MyComplexType”>
           <foo:a>AValue</foo:a>
           <foo:b>InterestingURI</foo:b>
      </MyComplexPropertyValue>
  </property>


  有element类型的属性声明:


  <property name=”elementFoo” element=”foo:fooElement”>
      <foo:fooElement>
           <foo:a>AValue</foo:a>
           <foo:b>InterestingURI</foo:b>
     </foo:fooElement>
  </property>


  简单类型的属性值:


  <property name=”SimpleTypeProperty”>
  MyValue
  </property>


  复杂类型的属性值,也展示了复杂类型属性值的设定:


  <property name=”complexFoo”>
      <MyComplexPropertyValue xsi_type=”foo:MyComplexType” attr=”bar”>
            <foo:a>AValue</foo:a>
            <foo:b>InterestingURI</foo:b>
      </MyComplexPropertyValue>
  </property>


  element类型的属性值(property value for an element type):


  <property name=”elementFoo”>
         <foo:fooElement attr=”bar”>
               <foo:a>AValue</foo:a>
               <foo:b>InterestingURI</foo:b>
        </foo:fooElement>
  </property>


  复杂类型的属性声明,这里提供了多值:


  <property name=”complexFoo” type=”foo:MyComplexType” many=”true”/>


  多值属性的值设定:


  <property name=”complexFoo”>
         <MyComplexPropertyValue1 xsi_type=”foo:MyComplexType”   attr=”bar”>
                <foo:a>AValue</foo:a>
               <foo:b>InterestingURI</foo:b>
         </MyComplexPropertyValue1>
         <MyComplexPropertyValue2 xsi_type=”foo:MyComplexType”   attr=”zing”>
               <foo:a>BValue</foo:a>
              <foo:b>BoringURI</foo:b>
         </MyComplexPropertyValue2>
  </property>


  此部分结束。。。


  原文出处:http://gocom.primeton.com/blog9562_35328.htm

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

liang_ma
liang_ma

相关推荐