Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger-2:如何根据对象的范围为同一对象类型创建不同的实例化?_Java_Dependency Injection_Dagger 2 - Fatal编程技术网

Java Dagger-2:如何根据对象的范围为同一对象类型创建不同的实例化?

Java Dagger-2:如何根据对象的范围为同一对象类型创建不同的实例化?,java,dependency-injection,dagger-2,Java,Dependency Injection,Dagger 2,我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的依赖性。我需要的是基于范围的不同对象实例。Dagger不允许这样,因为我会有多个绑定。如果没有@Named限定符,我将如何解决问题?例如,是否有方法覆盖子组件中的内容 //Higher scoped object (in component) @Provides @ClientScope ISupResRankStrategy iSupResRankStrategy(@Named("G

我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的依赖性。我需要的是基于范围的不同对象实例。Dagger不允许这样,因为我会有多个绑定。如果没有@Named限定符,我将如何解决问题?例如,是否有方法覆盖子组件中的内容

//Higher scoped object (in component)

    @Provides
    @ClientScope
    ISupResRankStrategy iSupResRankStrategy(@Named("GlobalModelConfig") JsonNode configSubTree,
            Lazy<SortByMagnitudeSum> strat1,
            Lazy<SortByShadowPercentage> strat2) {

        @SuppressWarnings("rawtypes")
        Map<String, Lazy> availableStrategies = new HashMap<>();
        availableStrategies.put(SortByMagnitudeSum.class.getSimpleName(), strat1);
        availableStrategies.put(SortByShadowPercentage.class.getSimpleName(), strat2);

        String configuredStrategy = configSubTree.findValue("ISupResRankStrategy").asText();
        return (ISupResRankStrategy) availableStrategies.get(configuredStrategy).get();
    }

Dagger不允许这样,因为我会有多个绑定。如果没有@Named限定符,我将如何解决问题?例如,是否有方法覆盖子组件中的内容

//Higher scoped object (in component)

    @Provides
    @ClientScope
    ISupResRankStrategy iSupResRankStrategy(@Named("GlobalModelConfig") JsonNode configSubTree,
            Lazy<SortByMagnitudeSum> strat1,
            Lazy<SortByShadowPercentage> strat2) {

        @SuppressWarnings("rawtypes")
        Map<String, Lazy> availableStrategies = new HashMap<>();
        availableStrategies.put(SortByMagnitudeSum.class.getSimpleName(), strat1);
        availableStrategies.put(SortByShadowPercentage.class.getSimpleName(), strat2);

        String configuredStrategy = configSubTree.findValue("ISupResRankStrategy").asText();
        return (ISupResRankStrategy) availableStrategies.get(configuredStrategy).get();
    }

没有。同一类型的两个对象不能同时具有不同的作用域。匕首怎么知道你想要这两个中的哪一个

要拥有多个相同类型的对象,可以

使用@Qualifier,@Named是其中之一,但您可以使用更好的名称创建自己的名称,例如@Client,@Model 使用组件依赖项而不是子组件,这样您就不能将对象公开给依赖组件,允许它们自己的实例
使用@Qualifier,@Named。你可以超载DI

例如

 @Provides @Named("type1") 
  Model provideModel() {
  return new Model();
  }

 @Provides @Named("type2") 
 Model provideModeWithContext(Context context) {
 return new Model(context);
   }

谢谢你的选择。从一开始我就不喜欢在代码中使用字符串!