Java 如何使用Guice注入包私有类

Java 如何使用Guice注入包私有类,java,guice,Java,Guice,首先,我喜欢Guice所做的,但是我也喜欢在我的系统中公开尽可能少的类。我的系统中的所有服务都是包私有的,只有接口是公共的。如果不使用提供程序,这会给Guice带来一些问题。我希望有一些替代方案,使我能够提供一个策略来完成以下工作: 对于组件C 需要依赖项X、Y、Z 调用此方法w/X,Y,Z来创建实例 。。对所有组件重复此操作 在上述psuedo代码的步骤2中,Guice现在扫描@inject注释。如果此策略可用,我可以决定如何以通用方式查找组件的依赖项 不幸的是,Module.bind不起作用

首先,我喜欢Guice所做的,但是我也喜欢在我的系统中公开尽可能少的类。我的系统中的所有服务都是包私有的,只有接口是公共的。如果不使用提供程序,这会给Guice带来一些问题。我希望有一些替代方案,使我能够提供一个策略来完成以下工作:

  • 对于组件C
  • 需要依赖项X、Y、Z
  • 调用此方法w/X,Y,Z来创建实例
  • 。。对所有组件重复此操作

    在上述psuedo代码的步骤2中,Guice现在扫描@inject注释。如果此策略可用,我可以决定如何以通用方式查找组件的依赖项

    不幸的是,Module.bind不起作用,因为它与类文本一起工作

    上面的策略界面可能如下所示

    interface ComponentDiscoverer {
       Set<ComponentDefinition> components();
    }
    
    interface ComponentDefinition<T> {
       List<RequiredDependency> requiredDependencies(); // similar to Guice's Key    
       <T> create( List<SatisfiedDependency> dependencies ); // factory method.
    }
    

    我的模块位于不同的包中,所有的创建都会通过Fatory,因为其他所有内容都是包私有的。

    除非您的应用程序非常简单,否则您不应该只有一个
    模块。对于要在其中使用的包私有类,每个包都应该有一个模块。这允许您将那些包私有类绑定到公共接口。这是使用Guice的标准实践,文档的一节中提到了这一点

    对于包中的模块,您只需要正常的
    @Inject
    可使用的构造函数或提供程序方法:

    @Provides @Alpha Service alpha(Dependency dependency) {
      return ServiceImpl.create(dependency);
    }
    

    Guice可以很好地处理包作用域类。只需将Guice模块添加到包中。你能给出一个你无法让Guice创建的类的例子吗?@NamshubWriter:我在q的底部添加了一个示例。
    @Provides @Alpha Service alpha(Dependency dependency) {
      return ServiceImpl.create(dependency);
    }