ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SCA客户端以及基于Java的模型实现(一)

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

原创 Linux操作系统 作者:ITPUB_PMSpace 时间:2008-01-18 09:52:18 0 删除 编辑
本节内容为阐述如何使用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类反射信息得到。









来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639375/viewspace-151144/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    188
  • 访问量
    372650