如何使用Guice注入包私有类

时间:2011-03-22 03:57:57

标签: java guice

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

  1. for component C
  2. 需要依赖关系X,Y,Z
  3. 调用此方法w / X,Y,Z来创建实例。
  4. ..再次重复所有组件。

    在上面的伪代码的第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.
    }
    
    1. Guice通过调用已注册的ComponentDiscoverer来获取所有组件。
    2. 然后调用已注册的ComponentDiscoverer.components();
    3. 对于每个ComponentDefinition.requiredDependencies()
    4. 按需调用ComponentDefinition.create
    5. 这是否构建为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);
      }
      

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

1 个答案:

答案 0 :(得分:5)

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

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

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