首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HK2等效辅助注射加FactoryModuleBuilder

HK2等效辅助注射加FactoryModuleBuilder
EN

Stack Overflow用户
提问于 2015-01-22 10:08:49
回答 2查看 740关注 0票数 4

由于迁移到泽西2,我需要从guice迁移到HK2。对于我的一些依赖项,我有一种辅助注入方法,但我无法在HK2中实现它。看起来它应该通过自定义注入解析器来解决,但我不太明白是怎么解决的。这些例子对我来说不够清楚。

这是在Guice上的样子:

代码语言:javascript
复制
public interface MyFactory {
    public MyClass createMyClass(@Assisted String dynamicParameter);
    public HisClass createHisClass(@Assisted String dynamicParameter);
    ...
}

binder.install(new FactoryModuleBuilder().build(MyFactory.class));

public class MyClass {
   ...
   @Inject
   public MyClass(@Assisted String dynamicParameter, SomeService someOtherServiceInjectedAutomatically){
      ...
   }
}

我如何在HK2上实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-22 11:16:36

在发布了这个问题之后,我想到这样做:

代码语言:javascript
复制
public class MyFactoryImpl implements MyFactory{

   private final SomeService someService;

   @Inject
   public MyFactoryImpl(SomeService someService){
      this.someService = someService;
   }

   public MyClass createMyClass(String dynamicParameter){
      return new MyClass(dynamicParameter, someService);
   }

   ...
}
票数 5
EN

Stack Overflow用户

发布于 2015-01-25 08:51:09

有一个盖斯桥 :-D

代码语言:javascript
复制
<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>guice-bridge</artifactId>
    <version>${hk2.version}</version>
</dependency>

下面是一个使用Guice3.0和HK2 2.3.0的示例(它与Jersey2.13捆绑在一起)。这只是一个独立的,但它应该工作在泽西岛的环境一样。

Guice课程

代码语言:javascript
复制
public class GuiceGreeter {
    public String getGreeting(String name) {
        return "Hello, " + name;
    }
}

import com.google.inject.assistedinject.Assisted;
import javax.inject.Inject;

public class Message {
    private final String message;  
    @Inject
    public Message(GuiceGreeter greeter, @Assisted String name) {
        message = greeter.getGreeting(name);
    }
    public String getMessage() {
        return message;
    }
}

public interface GuiceMessageFactory {
    public Message getMessage(String name);
}

import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;

public class GuiceMessageModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new FactoryModuleBuilder().build(GuiceMessageFactory.class));
        bind(GuiceGreeter.class);
    }   
}

HK2服务,它注入Guice工厂

代码语言:javascript
复制
import javax.inject.Inject;

public class HK2Service {
    private final GuiceMessageFactory messageFactory;

    @Inject
    public HK2Service(GuiceMessageFactory messageFactory) {
        this.messageFactory = messageFactory;
    }

    public void printMessage(String name) {
        System.out.println(messageFactory.getMessage(name).getMessage());
    }
}

Main

代码语言:javascript
复制
import com.google.inject.Guice;
import com.google.inject.Injector;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.api.ServiceLocatorFactory;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;

public class Main {
    public static void main(String[] args) {
        // Create service locator. In Jersey context, you should be able to
        // inject the `ServiceLocator` into the `Application/ResourceConfig` 
        // subclass constructor, or as a field
        ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
        ServiceLocator locator = factory.create("SimpleServiceLocator");

        // bridge the two frameworks to allow Guice injected services
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
        Injector injector = Guice.createInjector(new GuiceMessageModule());
        GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);

        // Add my HK2 Service
        ServiceLocatorUtilities.addClasses(locator, HK2Service.class);

        // Look up HK2 service. If this lookup works, `@Inject` in Jersey should.
        HK2Service service = locator.getService(HK2Service.class);
        service.printMessage("peeskillet");
    }
}

这个打印出了"Hello, peeskillet"。请参见下面的main方法,以便在泽西岛应用程序中获得ServiceLocator。如果您对ServiceLocator不熟悉,那么使用AbstractBinder添加的所有绑定也将被放入服务定位器上下文中,因此您不必显式地添加类,因为我在前面介绍了HK2Service

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28086033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档