gpt4 book ai didi

java - 使用 Guice 优化注册表

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:36:20 25 4
gpt4 key购买 nike

  • 嗨!今天想到了一种优化,有一些疑问……

上下文:我正在使用 Guice 2 在 Java 中进行开发。


在我的网络应用程序中,我有一个转换器注册表,可以即时转换为某种类型。转换器描述如下:

public class StringToBoolean implements Converter<String, Boolean>
{

@Override
public Boolean convert(String from)
{
return Boolean.valueOf(from);
}

}

我的注册表就是一个 map :

public class ConverterRegistryImpl implements ConverterRegistry
{

private Map<Key,Converter<?,?>> converterRegistry = new HashMap<Key, Converter<?,?>>();

@Override
public <F, T> void register(Class<F> fromType, Class<T> toType, Converter<F, T> converter)
{
converterRegistry.put(new Key(fromType,toType), converter);
}

}

最后,我在注册表中注册了转换器(类:ServletModule:configureServlets())
我认为这一步可以优化...

ConverterRegistryImpl registry = new ConverterRegistryImpl();
registry.register(String.class, Integer.class, new StringToInteger());
registry.register(String.class, Boolean.class, new StringToBoolean());
...
//Then I bind the registry to this current instance...
bind(ConverterRegistry.class).toInstance(registry)

这样我就可以像这样在任何地方使用它了:

@Inject 
ConverterRegistry converter;

  • 好吧,我正在寻找使用 Guice 实现它的最佳方法。
  • 更一般地说,您是如何使用(或不使用)Guice 构建这种注册表的?

提前致谢!

最佳答案

不知道“优化”到底是什么意思。您的方法的缺点之一是您手动创建转换器和注册表,因此您不会为它们使用依赖注入(inject)的好处。此外,您不能累积来自不同模块的转换器。

这可以通过 guice 的多重绑定(bind)扩展来解决:http://code.google.com/p/google-guice/wiki/Multibindings

    Injector injector = Guice.createInjector(new Module() {
@Override
public void configure(Binder binder) {
@SuppressWarnings("rawtypes")
Multibinder<Converter> converterBinder = Multibinder.newSetBinder(binder, Converter.class);
converterBinder.addBinding().to(StringBooleanConverter.class);
converterBinder.addBinding().to(BooleanStringConverter.class);
}
});
ConverterRegistryImpl registry = injector.getInstance(ConverterRegistryImpl.class);

完整代码位于:https://gist.github.com/1217563

关于java - 使用 Guice 优化注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com