由于迁移到泽西2,我需要从guice迁移到HK2。对于我的一些依赖项,我有一种辅助注入方法,但我无法在HK2中实现它。看起来它应该通过自定义注入解析器来解决,但我不太明白是怎么解决的。这些例子对我来说不够清楚。
这是在Guice上的样子:
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上实现这一点?
发布于 2015-01-22 11:16:36
在发布了这个问题之后,我想到这样做:
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);
}
...
}发布于 2015-01-25 08:51:09
有一个盖斯桥 :-D
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>guice-bridge</artifactId>
<version>${hk2.version}</version>
</dependency>下面是一个使用Guice3.0和HK2 2.3.0的示例(它与Jersey2.13捆绑在一起)。这只是一个独立的,但它应该工作在泽西岛的环境一样。
Guice课程
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工厂
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
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。
https://stackoverflow.com/questions/28086033
复制相似问题