继续翻译SCA组装模型规范 V1.0.0…..此部分描述–1.4 实现(Implementation).
1.4 实现(Implementation)
组件implementations是业务功能的具体实现,业务功能提供服务或产生服务的引用。另外,implementation可以有一些可设置的property值。
SCA允许选择implementation类型中的任何一个,比如Java,BPEL或C++,这里每一个类型都代表一个具体的实现技术。这些实现技术不仅仅是要定义实现的语言,如Java,还要定义所使用的框架和运行时环境。实例中包括使用Spring框架或Java EE EJB技术的Java实现。
举例来说,在一个composite文件里的component声明中,implementation.java和implementation.bpel各自代表Java和BPEL的实现类型。implementation.composite表示使用一个SCA composite作为一个实现。Implementation.spring和implementation.ejb表示分别用Spring框架和Java EE EJB技术来实现Java component。
下面的代码片段展示了对于Java和BPEL实现类型的implementation元素和使用一个composite作为一个实现:
<implementation.java class=”services.myvalue.MyValueServiceImpl”/>
<implementation.bpel process=”MoneyTransferProcess”/>
<implementation.composite name=”MyValueComposite”/>
Services、references、properties都是实现(implementation)的配置项。SCA共同引用它们作为component type。services、references、properties的特征已经在component段落中描述。依赖于实现类型,实现可以声明services、references和它拥有的properties,也可以为它们的特征设定值。
举例来说:
对于service,实现可以定义interface、binding(s)、URI和policy sets,包括bindings的细节(details)。
对于reference,实现可以定义interface、binding(s)、target URI(s)、intents、policy sets,包括bindings的细节。
对于property,实现可以定义它的类型和默认值。
实现自己可以定义intents和policy sets。
Services、reference和properties的大部分特征可能会被一个使用和配置实现的component覆盖,或者这个component也可以决定不去覆盖那些特征。一些特征如intents不会被覆盖。其它的特征如interfaces可以通过特殊的方式被覆盖(详见the Component section)。
一个实现声明services、references和properties的方式依赖于它的类型。比如,一些语言(像Java)提供注解(annotations),这些注解是用来在代码行里声明信息。
在运行时,一个implementation instance是实现的一个特殊的运行时实例,它的运行时形式依赖于实现所用的技术。implementation instance的业务逻辑源于它基于的实现,但是它的properties和references值来自于配置此实现的组件。
1.4.1 组件类型(Component Type)
Component type 表示一个实现的配置样式。组件类型包括提供的服务、对其它可被连线服务的引用以及可设置的属性。这些可设置的属性和对服务的引用由使用该实现的组件配置。
组件分为两步考虑(calculate),这里第二步增加了一些在第一步里发现的信息。第一步,反射(introspect)实现(如果可能),包括对实现注解(annotations)的反射。第二步,在实现的内观是不可能的地方或没有提供完整的信息的地方,寻找一个SCA 组件类型文件。在组件类型文件中找到的组件类型信息必须和从实现的检查中发现的等价信息一致。组件类型文件可以指定部分信息,其它的可以从实现(implementation)中得到。
理想情况下,组件类型信息由检查组件的实现决定,比如代码注解。组件类型文件提供了一个机制,即它为实现类型提供了组件类型信息,这里的组件类型信息不能由检查实现来决定。
一个component type文件和实现文件有相同的名字,并且有一个扩展名“.componentType”。组件类型由这个文件里的componentType元素定义。Component type文件的位置(location)依赖于组件实现的类型:关于实现的类型,在各自的客户端(client)和实现模型规范中都有所描述。
ComponentType元素可以包含service、reference和property子结点。
下面的代码展示了componentType模式。
<?xml version=”1.0″ encoding=”ASCII”?>
<!– Component type schema snippet –>
<componentType http://www.osoa.org/? >
<service name=”xs:NCName” requires=”list of xs:QName”?
policySets=”list of xs:QName”?>*
<interface/>
<binding uri=”xs:anyURI”? requires=”list of xs:QName”?
policySets=”list of xs:QName”?/>*
</service>
<reference name=”xs:NCName” target=”list of xs:anyURI”?
multiplicity=”0..1 or 1..1 or 0..n or 1..n”?
wiredByImpl=”xs:boolean”? requires=”list of xs:QName”?
policySets=”list of xs:QName”?>*
<interface/>?
<binding uri=”xs:anyURI”? requires=”list of xs:QName”?
policySets=”list of xs:QName”?/>*
</reference>
<property name=”xs:NCName” (type=”xs:QName” | element=”xs:QName”)
many=”xs:boolean”? mustSupply=”xs:boolean”?
policySets=”list of xs:QName”?>*
default-property-value?
</property>
<implementation requires=”list of xs:QName”?
policySets=”list of xs:QName”?/>?
</componentType>
ComponentType有一个单一的属性:
constrainingType(可选):comstrainingType的名字。指定后,实现(implementation)的services、references、properties和相关intents都要受到constrainingType定义的约束。参见 the ConstrainingType Section。
Service代表一个实现的可寻址的接口。它用componentType的子元素service表示。componentType可以有0个或多个service元素。详见the Service section。
Reference表示实现对其它组件提供服务的一个需求。它用componentType的子元素reference表示。在component type定义中,componentType可以有0个或多个reference元素。
Properties允许实现的配置中可以在外部设定值。每一个property定义为一个property元素。componentType元素可以有0个或多个property子元素。参见the Property section。
Implementation表示自身的一些特征,特别地,如intents和policies。参见the Policy Framework specification[10]。
1.4.1.1 componentType举例
下面的代码展示了MyValueServiceImpl implementation的componentType文件内容。这个componentType文件展示了MyValueServiceImpl implementation的services、references和properties。Java被用来定义接口。
<?xml version=”1.0″ encoding=”ASCII”?>
<componentType http://www.osoa.org/>
<interface.java interface=”services.myvalue.MyValueService”/>
</service>
<reference name=”customerService”>
<interface.java interface=”services.customer.CustomerService”/>
</reference>
<reference name=”stockQuoteService”>
<interface.java interface=”services.stockquote.StockQuoteService”/>
</reference>
<property name=”currency” type=”xsd:string”>USD</property>
</componentType>
1.4.1.2 Implementation举例
下面是一个用Java写的implementation例子,参见SCA Example Code document[3]。
AccountServiceImpl实现了AccountService用Java编写的接口:
package services.account;
@Remotable
public interface AccountService{
public AccountReport getAccountReport(String customerID);
}
下面是AccountServiceImpl类的完整代码,展示了它实现的service、服务references和可设置的properties。注意代码中标记SCA 样式的Java注解,包括@Property和@Reference:
package services.account;
import java.util.List;
import commonj.sdo.DataFactory;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Reference;
import services.accountdata.AccountDataService;
import services.accountdata.CheckingAccount;
import services.accountdata.SavingsAccount;
import services.accountdata.StockAccount;
import services.stockquote.StockQuoteService;
public class AccountServiceImpl implements AccountService {
@Property
private String currency = “USD”;
@Reference
private AccountDataService accountDataService;
@Reference
private StockQuoteService stockQuoteService;
public AccountReport getAccountReport(String customerID) {
DataFactory dataFactory = DataFactory.INSTANCE;
AccountReport accountReport = (AccountReport)dataFactory.create (AccountReport.class);
List accountSummaries = accountReport.getAccountSummaries();
CheckingAccount checkingAccount = accountDataService.getCheckingAccount(customerID);
AccountSummary checkingAccountSummary = (AccountSummary) dataFactory.create(AccountSummary.class);
checkingAccountSummary.setAccountNumber (checkingAccount.getAccountNumber());
checkingAccountSummary.setAccountType(“checking”);
checkingAccountSummary.setBalance(fromUSDollarToCurrency (checkingAccount.getBalance()));
accountSummaries.add(checkingAccountSummary);
SavingsAccount savingsAccount = accountDataService.getSavingsAccount(customerID);
AccountSummary savingsAccountSummary = (AccountSummary) dataFactory.create(AccountSummary.class);
savingsAccountSummary.setAccountNumber(savingsAccount.getAccountNumber());
savingsAccountSummary.setAccountType(“savings”);
savingsAccountSummary.setBalance(fromUSDollarToCurrency (savingsAccount.getBalance()));
accountSummaries.add(savingsAccountSummary);
StockAccount stockAccount = accountDataService.getStockAccount(customerID);
AccountSummary stockAccountSummary = (AccountSummary)dataFactory.create(AccountSummary.class);
stockAccountSummary.setAccountNumber(stockAccount.getAccountNumber());
stockAccountSummary.setAccountType(“stock”);
float balance= (stockQuoteService.getQuote(stockAccount.getSymbol()))*stockAccount.getQuantity();
stockAccountSummary.setBalance(fromUSDollarToCurrency(balance));
accountSummaries.add(stockAccountSummary);
return accountReport;
}
private float fromUSDollarToCurrency(float value){
if (currency.equals(“USD”)) return value; else
if (currency.equals(“EURO”)) return value * 0.8f; else
return 0.0f;
}
}
下面是AccountServiceImpl等价的SCA componentType 定义,通过对上面代码的反射(reflection)得到。
<?xml version=”1.0″ encoding=”ASCII”?>
<componentType http://www.osoa.org/http://www.w3.org/2001/XMLSchema”>http://www.w3.org/2001/XMLSchema“>
<service name=”AccountService”>
<interface.java interface=”services.account.AccountService”/>
</service>
<reference name=”accountDataService”>
<interface.java interface=”services.accountdata.AccountDataService”/>
</reference>
<reference name=”stockQuoteService”>
<interface.java interface=”services.stockquote.StockQuoteService”/>
</reference>
<property name=”currency” type=”xsd:string”>USD</property>
</componentType>
关于Java实现的完整细节,参见Java Client and Implementation Specification 和SCA Example Code 文档。其它的实现类型都有自己的说明文档。
原文出处:http://gocom.primeton.com/blog9320_35328.htm
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
如何看待微软收购Xamarin?
今年三月微软正式收购了Xamarin,你认为微软收购Xamarin对其有什么作用?
-
内存数据网格提供商一头扎进Java
10年的时间里,应用性能解决方案提供商Alachisoft一直在用NCache(针对N-Tier和网格计算.NET应用的内存计算和数据网格产品)为.NET社区服务。
-
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高, 直到把内存吃完应用崩溃,但是这个wrapper
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高 […]
-
Google App Engine for Java 对于目前中国需要学习吗?