当前位置: 首页 > 面试题库 >

如何使HK2 ServiceLocator使用从其桥接的ServiceLocator中的Singleton服务实例?

有翰海
2023-03-14
问题内容

ExtrasUtilities.bridgeServiceLocator()通过将应用程序ServiceLocator桥接到Jersey
ServiceLocator,我们正在使用来将在一个ServiceLocator中创建的现有Singleton应用程序服务注入Jersey RESTful
Web服务。

但是,没有使用“外部”定位器中存在的Singletons-
将每个服务注入到Jersey服务中后都会再次创建它们。似乎Singleton仅在ServiceLocator的范围内可见,即使已桥接也是如此。

这是预期的行为吗?如果是这样,是否有任何方法可以更改此行为,并在桥接的ServiceLocators中具有真正的Singleton?

我已将问题提取到一组测试类中,这些类说明了以下几点:

public class BridgedServiceTest
{
  private ServiceLocator _outerServiceLocator;
  private ServiceLocator _innerServiceLocator;

  @Test
  public void testBridgedInnerServiceOK() throws Exception
  {
    ServiceLocatorFactory serviceLocatorFactory = ServiceLocatorFactory.getInstance();

    _outerServiceLocator = serviceLocatorFactory.create("Outer");
    ServiceLocatorUtilities.addClasses(_outerServiceLocator, SingletonServiceImpl.class);

    _innerServiceLocator = serviceLocatorFactory.create("Inner");
    ExtrasUtilities.bridgeServiceLocator(_innerServiceLocator, _outerServiceLocator);

    final Client client1 = new Client();
    _outerServiceLocator.inject(client1);
    assertThat(SingletonServiceImpl.instanceCount.get(), Matchers.is(1));
    client1.test();

    final Client client2 = new Client();
    _innerServiceLocator.inject(client2);
    // next line fails as instance count is 2
    assertThat(SingletonServiceImpl.instanceCount.get(), Matchers.is(1));
    client2.test();
  }

  @After
  public void tearDown() throws Exception
  {
    _innerServiceLocator.shutdown();
    _outerServiceLocator.shutdown();
  }
}

@Contract
public interface SingletonService
{
  void fulfil();
}

@Service
public class SingletonServiceImpl implements SingletonService
{
  public static AtomicInteger instanceCount = new AtomicInteger();

  @PostConstruct
  public void postConstruct()
  {
    instanceCount.incrementAndGet();
  }

  @Override
  public void fulfil()
  {
    System.out.println("Contract Fulfilled.");
  }
}

public class Client
{
  @Inject
  private SingletonService _singletonService;

  public void test()
  {
    _singletonService.fulfil();
  }

  public SingletonService getSingletonService()
  {
    return _singletonService;
  }
}

问题答案:

ServiceLocator桥中有一个错误已修复。该修复程序将在hk2 2.5.0-b07或更高版本中!



 类似资料:
  • 我们正在使用using通过将app ServiceLocator桥接到Jersey ServiceLocator中,将在一个ServiceLocator中创建的现有单例应用程序服务注入到Jersey RESTful Web服务中。 然而,存在于“外部”定位器中的单例并没有被使用--每个服务都是在注入到Jersey服务中时再次创建的。单例似乎只在ServiceLocator的范围内可见,即使它是桥接

  • 我们必须通过配置用户名、密码和公钥,使用代理服务器internet.ford.com从应用程序连接到外部SFTP服务器。 预期与外部SFTP服务器的连接成功。

  • 问题内容: 在阅读协变量替代时,我发现一个非常奇怪的事实, 使用桥接技术实现协方差方法覆盖。它还说此功能是在java5及更高版本中实现的。(我认为这是因为从java5引入了泛型) 怎么发生的。请帮我举个例子。 问题答案: 考虑一个例子: 到目前为止看起来不错。但是,在擦除类型之后,接口松开了它的泛型类型,并将该类型替换为上限。因此,接口和类如下所示: 现在,这就是问题所在。擦除后的方法实际上不是的

  • 我想使用实现以下目标:拥有一个不断接收和写入数据的单例开放套接字,asyncrhon! 这意味着我必须打开一个不断从单个套接字读取的套接字,分派每个消息进行异步处理,并通过套接字异步返回响应。 如何实现这种异步模式? 特别是:如何使用序列化器/反序列化器?据我所知,序列化程序只在新的套接字连接上调用,所以在我的情况下,只在第一条消息的开头调用一次?

  • 问题内容: 早上好,我目前正在开发一个公开Web服务接口的Java Web应用程序。为了将全局对象保留在内存中,我将以下类用作Singleton: 我使用上面的类是为了使Web服务的所有线程都具有相同的HashMap实例。维护SingletonMap对象的Web服务类如下: 我拥有方法getCouponMapCreationTime()的原因是要检查Web服务的所有线程是否正在访问同一对象。以上方