本节内容为阐述如何使用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类反射信息得到。