java - Guice:使用@Named 创建对象

标签 java dependency-injection guice

使用 Guice,如果我有

@Inject @Named("light")
Color light;

我可以用
bind(Color.class).annotatedWith(Names.named("light"))
    .toInstance(new Color("white"));

如果 Color 构造函数只需要颜色名称,则将其绑定(bind)到白色。

但是,如果 Color 构造函数还需要由 Guice 创建的对象,我该怎么做呢?例如:
@Inject
public Color(ColorSet colorset, String colorName) {...}

其中颜色集由 Guice 在运行时创建,在 configure(){...} 中不可用。

我想这样做没有:
  • 为我需要注入(inject)的每种颜色创建一个类/子类(如 WhiteColor)
  • 在我的代码中直接使用反射
  • 更改我的类(class)以使用 ColorFactoy factory; factory.get("light");而不是 @Named("light") Color light;
  • 最佳答案

    最好的方法不是使用工厂,而是使用 @Provides methods .我的公司非常非常广泛地使用 Guice,并且 requestInjection总是被认为是一个坏主意,因为它可以很容易地建立一个非常脆弱的隐式依赖关系图。

    它应该是这样的:

    public class FooModule extends AbstractModule {
      protected void configure() {
        // do configuration
      }
    
      @Provides
      @Named("white")
      Color provideWhiteColor(ColorSet colorSet) {
        return colorSet.white(); // or whatever
      }
    
      @Provides
      @Named("black")
      Color provideBlackColor(ColorSet colorSet) {
        return colorSet.black(); // or whatever
      }
    
      // etc
    }
    

    关于java - Guice:使用@Named 创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290164/

    相关文章:

    Java 泛型未经检查强制转换警告 : abstract class A<T extends A>

    java - 如何搜索其他网站的内容并检索结果并放置在我们的 Android 应用程序中?

    java - 使用 GWT 和 Maven 得到 UnsupportedActionException

    spring - 谁能比较 Google Guice 和 Spring DI?

    java - Spring 发现 beans 从版本 4.3 更改为版本 5

    java - 如何给JButton设置图像图标?

    java - 如何使用 Spring @Configuration 覆盖导入的资源?

    dependency-injection - Swift 的对象框架宏

    java - 从数据模型访问同级数据

    java - 为什么需要实现一个在手动播种值时抛出异常的提供程序?