此部分描述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中国
作者
相关推荐
-
如何透过业务和技术看SOA的发展
随着SOA发展的深入,各种SOA相关技术标准也随之发展和完善。面对庞大而复杂的SOA相关技术标准,我们如何来有选择的使用它们呢?
-
SOA架构下补偿模型驱动的安全苛求软件开发
随着我国高速铁路的快速发展,传统的计算机联锁软件开发方法在灵活性、可维护性、安全性以及开发效率上都显露出不足,怎样才能弥补这一不足呢?
-
浅谈基于SOA架构的服务集成技术研究
在近几年软件行业的发展中,面向服务架构(SOA)成为了当下的热门话题。那么对于SOA架构的服务集成你又了解多少?
-
揭秘WebSphere Process Server中SCA组件的事务实现机制
SCA作为一种新的编程模型,自然也需要提供完整的事务支持。所幸的是WPS本身是基于WebSphere Application Server的,所以底层天然就具有了强大的事务处理能力。