`
raymond.chen
  • 浏览: 1441693 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

服务工厂(ServiceFactory)

    博客分类:
  • OSGi
阅读更多

一般情况下,服务对象在注册后,任何其它的Bundle在请求该服务时,OSGi容器都是返回同一个对象。如果我们需要为每一个Bundle消费者返回不同的服务对象,或者,在真正需要该服务对象时才创建。对于这些情况,我们可以创建一个实现ServiceFactory接口的类,把该类的对象注册为服务(不是注册实际的服务对象),这样,当Bundle请求该服务时,ServiceFactory实现类将接管该请求,为每个Bundle新建一个实际的服务对象。以下是服务工厂的使用范例源码:

 

1、服务接口及其实现类

public interface HelloService {
	public String sayHello(String name);
}

 

public class HelloServiceImpl implements HelloService {
	public String sayHello(String name) {
		return "Hello " + name;
	}
}

 

2、服务工厂类

public class HelloServiceFactory implements ServiceFactory {
	//当请求服务时,OSGi容器会调用该方法返回服务对象。
	//当服务对象不为null时,OSGi框架会缓存这个对象,即对于同一个消费者,将返回同一个服务对象。
	public Object getService(Bundle bundle, ServiceRegistration serviceRegistration) {
		System.out.println("创建HelloService对象:" + bundle.getSymbolicName());
		HelloService helloService = new HelloServiceImpl();
		return helloService;
	}

	//当Bundle释放服务时,OSGi容器会调用该方法
	public void ungetService(Bundle bundle, ServiceRegistration serviceRegistration, Object service) {
		System.out.println("释放HelloService对象:" + bundle.getSymbolicName());
	}
}

  

3、Bundle激活器类

public class Activator implements BundleActivator {
	ServiceRegistration serviceRegistration;
	
	public void start(BundleContext context) throws Exception {
		//注册服务
		HelloServiceFactory helloServiceFactory = new HelloServiceFactory();
		serviceRegistration =  context.registerService(HelloService.class.getName(), helloServiceFactory, null);
		
		//获取服务(通过服务工厂取得)
		ServiceReference serviceReference = context.getServiceReference(HelloService.class.getName());
		HelloService selloService = (HelloService)context.getService(serviceReference);
		System.out.println("1: " + selloService.sayHello("cjm"));
		
		//第二次取得的服务对象与之前取得的是同一个对象
		serviceReference = context.getServiceReference(HelloService.class.getName());
		selloService = (HelloService)context.getService(serviceReference);
		System.out.println("2: " + selloService.sayHello("cjm"));
	}
	
	public void stop(BundleContext context) throws Exception {
		serviceRegistration.unregister();
	}
}

 

分享到:
评论

相关推荐

    XFire客户端流程分析

    服务模型由服务工厂ServiceFactory创建,用户需提供服务接口、名称、命名空间等信息,服务接口是必不可少的。 2. 创建Client实例 Client是XFire客户端的核心,它代表了要调用的服务。可以手动创建Client,也可以...

    asp.net 工厂模式

    我们可以定义一个工厂类`ServiceFactory`,其中包含一个静态方法`CreateService`,该方法接受一个字符串参数,表示要创建的服务类型。工厂方法可以根据输入的字符串使用反射创建相应的服务实例: ```csharp public ...

    osgi实例(服务注册、引用、跟踪)

    服务工厂是一个实现了`java.lang.Object`和`org.osgi.framework.ServiceFactory`接口的类。`ServiceFactory`提供了`getService(Bundle, ServiceRegistration)`和`ungetService(Bundle, ServiceRegistration, Object)...

    JAVA调用webservice 服务端

    // 创建客户端工厂 ServiceFactory factory = ServiceFactory.newInstance(); // 从WSDL地址加载服务 Client client = factory.create("http://example.com/your_service?wsdl"); // 调用服务方法 ...

    WCF客户端动态设置WCF服务器主机.doc

    `ServiceFactory` 类实现了`IServiceFactory`接口,这是一个自定义的服务工厂,允许我们控制服务实例的创建和初始化。在这个例子中,`ServiceFactory`包含了服务器的主机地址和端口号属性,使得我们可以动态地改变...

    WCF客户端动态设置WCF服务器主机[文].pdf

    在给定的代码片段中,可以看到一个名为`ServiceFactory`的类,它是用来创建和管理WCF服务实例的工厂类。这个类包含了两个关键属性:`Host`和`Port`,分别表示WCF服务器的IP地址和端口号。这两个属性可以被客户端程序...

    使用SAAJ 和JAXM的 SOAP客户端及服务

    6. **ServiceFactory**: 用于创建Sender和Receiver的工厂类。 使用JAXM构建SOAP客户端,你需要: 1. 获取`MessageFactory`和`ServiceFactory`实例。 2. 创建`Sender`,配置连接到SOAP服务的端点。 3. 创建`Source`...

    MYECLIPSE开发webservice的步骤详解

    接下来,创建一个名为`ServiceFactory`的工厂类,用于实例化并返回`Service`接口的实现。工厂类如下所示: ```java import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; public...

    Apache CXF 快速上手教程.docx

    前端负责服务的创建,通过ServiceFactory完成。 4. **服务模型**:CXF中的服务由ServiceInfo和服务本身表示。ServiceInfo包含接口、绑定和端点信息,服务则包括ServiceInfo、数据绑定、拦截器和服务属性。 5. **...

    在一个bundle中获得一个服务的不同对象

    用ServiceFactory只能保证每个bundle获得不同的服务对象,当如果在同一个bundle中获得某个服务的多个对象就不行,还是获得同一个对象。 注册一个对象工厂,当需要获得一个服务对象时,生成该服务的对象,返回出去。

    XFire客户端分析

    服务工厂 `ServiceFactory` 负责根据用户提供的服务接口、名称、命名空间等创建服务模型。 2. **创建 Client 实例**:Client 是客户端的核心,它代表了要调用的服务。可以通过配置或使用 `XFireProxyFactory` 创建 ...

    CXF Web Server 教程

    服务通常由前端通过ServiceFactory创建。 5. **绑定(Binding)**:定义了如何将具体格式和协议映射到传输上,主要包括Binding和BindingFactory。 6. **传输(Transport)**:CXF提供传输抽象,包括Conduit(消息...

    EOS工作流引擎工作原理.pdf

    事件服务类(EventService)是事件调度机制的入口,用户可以通过服务工厂类(ServiceFactory)取得事件服务实例。事件服务类有两个实现类:单线程的实现类(SingleThreadEventService)和多线程的实现类...

    金蝶苍穹系统 业务跨系统操作实现最终一致性

    ServiceFactory 是一个提供服务工厂的类,该类用于创建和管理服务实例。在金蝶苍穹系统中,ServiceFactory 用于创建EventualConsistencyService 的实例。 FoobarOperationPlugin 是一个操作插件,该插件提供了跨...

    magento-oauth:Lusitanian PHP OAuth库的Magento OAuth服务

    您可以创建自己的Magento服务实例,也可以使用Lusitanian OAuth库中的服务工厂,以确保将所有依赖项注入服务中: <?php use OAuth \ Common \ Storage \ Session ; use OAuth \ Common \ Consumer \ ...

    javax.xml.rpc相关jar包

    - `javax.xml.rpc.ServiceFactory`:这个接口提供了创建服务代理的工厂方法,用于与Web服务交互。 - `javax.xml.rpc.Service`:这是服务端点接口的抽象基类,提供了与服务交互的基本方法,如获取操作的端点地址、...

    Java on Guice - Developer Day Slides.pdf

    示例代码展示了如何通过`ServiceFactory`创建`Service`实例,并通过`Client`调用`Service`的方法。在单元测试中,可以通过设置工厂的实例来插入一个`MockService`来进行测试。但是这种方式存在一些问题: - 单元...

    用java调用ebservices三种方式.doc

    `ServiceFactory`是一个工厂类,用于创建服务访问对象。 ```java javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(...); ``` 接下来,我们将讨论三种调用Web服务的主要方式: ### 1...

    使用XFire+Spring构建Web Service

    2. **配置Spring**:创建一个Spring配置文件(如:applicationContext.xml),在其中定义XFire的相关bean,如服务发布器(ServiceBean)、服务工厂(ServiceFactory)以及消息处理器(MessageBroker)。 3. **定义...

    EJB 3.0 学习资料

    - 客户端需要一个服务工厂类(如serviceFactory.java),负责建立到服务器的连接,并获取EJB的远程接口实例。 - 通常使用JNDI(Java Naming and Directory Interface)查找EJB的JNDI名称,然后通过EJB接口调用...

Global site tag (gtag.js) - Google Analytics