sca java_SCA客户端以及基于Java的模型实现(一)

本节内容为阐述如何使用Java编程语言实现SCA组件。我们将会了解一个以Java实现的组件如何实现一个本地或远端服务,以及如何通过属性文件使得实现的方式可配置。

本节内容为阐述如何使用Java编程语言实现SCA组件。我们将会了解一个以Java实现的组件如何实现一个本地或远端服务,以及如何通过属性文件使得实现的方式可配置。

在SCA组件的实现模型中提供了一系列的标签,这些标签可以嵌入在代码中。这些标签在SCA运行期对实现有着重要的影响。每个组件实现本身也是其他服务的一个客户端。组件实现的这一特征在基本客户端模型一节中进行了说明。

实现一个 Service

一个基于Java类(一个Java实现)的组件实现能提供一个或多个服务。

以Java实现的服务拥有一个接口,该接口可以用下列三种方式之一来定义:

一个Java接口(必须是SCA风格的)

一个Java类(可以方便地集成现有Java类,但是只能用来实现本地服务,见“实现一个本地服务”一节)

一个从“Web服务描述语言” (WSDL)的portType生成的Java接口(从WSDL portType生成的Java 接口总是远程的,见“实现一个远程服务”一节)

在Java实现上的服务要求实现服务接口定义的所有操作。如果服务的接口是以Java接口定义的,那么基于Java类的组件模型的实现可以实现该Java接口,也可以实现该服务接口所定义的所有操作。

所有基于Java类的组件模型的实现,其Java类必须要有一个无参数的构造函数。

@Service 标签是用于标注一个Java类实现了哪些服务。用于实现服务的类不一定要有@Service 标签。如果没有这个标签,那么该类所实现的标注有@Remotable标签的接口都将被视为该Java组件所提供的服务。若该类实现的接口中没有任何一个带有@Remotable标签,则默认该实现类本身为一个服务。

@Service标签上有两个属性:

interfaces – 接口或类对象的名称的数组。表示该组件所暴露的服务。

value – 接口或类对象的名称。两种属性只能指定其中一个。

没有属性的@Service标签是没有意义的,跟没有该标签是一样的。

所定义的服务的service names默认是不带包名的接口或类的名字。

如果一个Java组件实现需要实现同一个接口的两个服务,则需要继承该接口(在子接口中,不能添加任何方法),然后在Java实现类的@Service标签中同时声明这两个接口即可。

以下代码为在Java所实现服务的接口和服务的实现。

package services.hello;

public interface HelloService {

String hello(String message);

}

package services.hello;

import org.osoa.sca.annotations.*;

@Service(HelloService.class)

public class HelloServiceImpl implements HelloService {

public String hello(String message) {

...

}

}

以下代码为这个组件实现的组件类型定义。在这里,我们不需要指明组件的类型,因为这可以从Java类反射的信息中获得。

以下代码是一个Java实现类,它本身即是一个服务接口。

package services.hello;

import org.osoa.sca.annotations.*;

@Service(HelloServiceImpl.class)

public class HelloServiceImpl implements AnotherInterface {

public String hello(String message) {

...

}

}

根据@Service标签的默认规则,你也可以写成一下这种形式。

package services.hello;

public class HelloServiceImpl implements AnotherInterface {

public String hello(String message) {

...

}

}以下代码为以上两种组件实现的组件定义,并且服务的接口是实现类自己所定义的。组件的类型不需要在这里指明,因为可以通过Java类反射信息得到。

以下代码为实现了两个服务的Java实现类。

package services.hello;

import org.osoa.sca.annotations.*;

@Service(interfaces={HelloService.class, AnotherInterface.class})

public class HelloServiceImpl implements HelloService, AnotherInterface

{

public String hello(String message) {

...

}

}

以下代码为该组件实现的组件定义。组件的类型不需要在这里指明,因为可以通过Java类反射信息得到。

以下代码为通过定义接口的子接口,同时实现一个服务接口中的两个服务的Java实现类。

package services.hello;

public interface HelloService {

String hello(String message);

}

package services.hello;

public interface HelloService2 extends HelloService {

}

package services.hello;

import org.osoa.sca.annotations.*;

@Service(interfaces={HelloService.class,HelloService2.class})

public class HelloServiceImpl implements HelloService {

public String hello(String message) {

...

}

}

以下代码为该组件实现的组件定义。组件的类型不需要在这里指明,因为可以通过Java类反射信息得到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值