此部分描述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 xmlns="http://www.osoa.org/xmlns/sca/1.0"
- targetNamespace="xs:anyURI"
- 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):
l name(必需):构件的名称。其形式是一个XML QName,在命名空间中由 targetNamespace属性标识。
l targetNamespace(可选):构件被声明的目标命名空间中的一个标识符。
l local(可选):此构件里的所有组件是否都必须运行在同一个操作系统进程里。值为true,表示必须运行在同一操作系统进程里。默认为false,表示此构件里的不同组件可以运行在不同的操作系统进程里,甚至可以运行在网络中的不同节点。
l autowire(可选):构件所包含的组件引用是否应该被自动连线,参见the Autowire section. 默认是false。
l constrainingType(可选):contrainingType的名字。指定后,构件的服务、引用、属性还有相关意图都要受到constrainingType定义的约束。参见the ConstrainingType Section。
l requires(可选):策略意图列表。参见Policy Framework specification[10].
l 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 xmlns="http://www.osoa.org/xmlns/sca/1.0"
- name="xs:QCName" ... >
- ...
- <property name="xs:NCName" (type="xs:QName" | element="xs:QName")
- many="xs:boolean"? mustSupply="xs:boolean"?>*
- default-property-value?
- </property>
- ...
- </composite>
property元素有下列属性:
l name(必需):属性的名字。
l type、element之一(必需):
² type,属性的类型,是一个XML模式类型的限定名。
² element,属性的类型,它是一个全局element。
l many(可选):属性是否是单值(false)或多值(true)的。默认是false,在多值的情况下,属性的值在实现里被表示为一个集合类(Collection)。
l 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 xmlns="http://www.w3.org/2001/XMLSchema"
- targetNamespace="http://foo.com/"
- xmlns:tns="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 xmlns="http://www.osoa.org/xmlns/sca/1.0"
- xmlns:foo="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 xmlns="http://www.osoa.org/xmlns/sca/1.0"
- xmlns:foo="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>
此部分结束。。。
|