2017-08-17 27 views
0

在泽西岛的奇怪,奇怪的依赖注入世界中,您可以包含一个AbstractBinder(但可能不只是一个Binder)作为Application的方法的返回值中的一个对象。在Jersey 2.X中,一个功能由HK2实例化。我如何使用我也添加的工厂?

AbstractBinder可以调用各种bind()方法从configure()方法,其中新泽西州,但没有其他JAX-RS实现中,是保证呼叫,因此你可以链接实现对接口,它可以让你做的假象从这一点开始依赖注入在你的应用程序中。也就是说,一旦你这样做了,那么你的资源类中的注入点就会被你所绑定的实现“填充”。

(您也可以与工厂类做到这一点,让你一个特定的工厂方法的返回值绑定到它实现合同。)

OK,挺好的。

Jersey还允许您将实施FeatureClass放入您的ApplicationgetClasses()方法的返回值中。精细。这个Feature类将由HK2在封面下实例化 - 请记住这一点! - 它的configure(FeatureContext)方法将在某个时刻被调用。在那一点上,Feature可能会通过调用FeatureContext#register()来注册一些额外的东西,并将它交给任何想要注册的东西。 (想必这毕竟是一个相当复杂的FAç ADE上HK2的DynamicConfiguration机器的顶部)

无论如何,因为Feature由HK2(记住)实例,它遵循的是你可以@Inject东西到它的构造,或在课堂其他地方有注射点。这很酷!然后HK2可以利用它所知道的所有服务来填补这些注入点。井井有条。

啊,但问题是:此时HK2世界的状况如何?什么服务可以注入到Feature实现中,作为JAX-RS Application的启动序列的一部分实例化?

如果您ApplicationgetSingletons()方法返回一个AbstractBinder实现,在其configure()方法结合一个FooImplFooSingleton范围,可以在Feature - ‘注册’通过在您Application的返回值及一流的getClasses()方法 - 然后注入Foo

+0

最后几句话很混乱。也许一些代码显示什么在工作,哪些不工作,以及你期望的工作将会有所帮助。 –

+0

你说得很对。我会删除它们。粗体部分是我的主要问题。回顾一下:似乎在'AbstractBinder'中绑定的项目不可用于注入到“特征”中。有什么能说明这种行为应该是什么?在'AbstractBinder'实现''configure()'方法被调用之前'Feature'是否被实例化? –

+0

我想它应该工作。我会测试它并看看。 –

回答

1

我觉得有你Foo接口绑定代理是很重要的,即:

new AbstractBinder() { 
      @Override 
      protected void configure() { 
       bind(Foo.class) 
        .proxy(true) 
        .to(FooImpl.class) 
        .in(Singleton.class); 
      } 
} 

那么依赖注入将是不敏感的instatination秩序。

相关问题