如何使用Guice注入包私有类

mP.*_*mP. 2 java guice

首先,我喜欢Guice所做的事情,但是我也喜欢在我的系统中公开几个类.我系统中的所有服务都是包私有,只有公共接口.如果不使用提供者,这会给Guice带来一些问题.我希望有一些替代方案可以让我提供一个策略来执行以下操作:

  1. 对于组件C
  2. 需要依赖X,Y,Z
  3. 调用此方法w/X,Y,Z来创建实例.

..再次重复所有组件.

在上面的伪代码的第2步中,Guice现在扫描@inject注释.如果这个策略可用,我可以决定id如何以通用方式查找组件的依赖项.

不幸的是,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.
}
Run Code Online (Sandbox Code Playgroud)
  1. Guice通过调用已注册的ComponentDiscoverer来获取所有组件.
  2. 然后它调用已注册的ComponentDiscoverer.components();
  3. 对于每个ComponentDefinition.requiredDependencies()
  4. 按需调用ComponentDefinition.create

这有没有内置到Guice方式或第三方库来实现上述目标?

样品

package companyX;

public interface Service {
   void execute();
}

package companyX;

package private class ServiceImpl implements Service {

   static ServiceImpl create( Dependency dependency){
       return new ServiceImpl( dependency );
   }

   private ServiceImpl( Dependency dependency ){
   }
   void execute();
}

package companyX;

package private class ServiceImpl2 implements Service2{
}

package companyX;

public class Factory {
    Service alpha( Dependency ){
       return ServiceImpl.create( dependency );
    }
    Service beta( DifferentDependency ){
        // boring left out
    }
    Service2 gamma( AnotherDifferentDependency);
}
Run Code Online (Sandbox Code Playgroud)

我的模块生活在一个不同的包中,所有创建都通过Fatory,因为其他一切都是包私有的.

Col*_*inD 5

Module除非您的应用程序非常简单,否则您不应该只有一个.您应该为每个包都有一个模块,您希望在其中使用包私有类.这允许您将这些包私有类绑定到公共接口.这是使用Guice的标准做法,它在文档的Keep Constructors Hidden部分中提到.

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

@Provides @Alpha Service alpha(Dependency dependency) {
  return ServiceImpl.create(dependency);
}
Run Code Online (Sandbox Code Playgroud)