0

我一直在其他项目中使用 Spring,但我想尝试一下 Guice。所以我查找教程和示例,我发现了这个:

public interface MyService {
   void serviceOperation1();
   void serviceOperation2();
   void serviceOperation3();
}

public class MyServiceImpl implements MyService {
   @Inject
   public MyServiceImpl() {
   }
   public void serviceOperation1() {
      // ...
   }
   public void serviceOperation2() {
      // ...
   }
   public void serviceOperation3() {
      // ...
   }
}

public class MyServiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON);
    }
}

我正在这样的模块中开发我的项目: 简单的项目图

我不想要任何循环依赖。

我可以在哪里放MyServiceModule课,这样我就不会依赖coreto 了data

放入或放入其中MyServiceModule将使我导入或(分别)依赖于模块,并依赖于???coredataMyServiceImplMyServiceModulecoredatadatacore

我错过了一些重要的概念吗?在 Spring 中,我会使用上下文来实现MyService.

提前致谢。

4

1 回答 1

1

这完全取决于您如何拆分。如果你把它们都放在一个地方,它们就会有一组依赖项。

请记住,MyServiceModule 将并且必须依赖于 MyServiceImpl,因为它是配置 impl 的。它就像上下文 xml 文件,仅在 java.xml 中。通常,人们会构造这样的东西:

my/app/core/buildfile (pom.xml or build.xml or whatever)
my/app/core/MyService.java

my/app/service/impl/buildfile (pom.xml or build.xml or whatever)
my/app/service/impl/MyServiceImpl.java
my/app/service/impl/MyServiceImplModule.java

my/app/web/buildfile (pom.xml or build.xml or whatever)
my/app/web/WebServerMain.java

and 

// Uses install() in its configure() method to include
// my/app/service/impl/MyServiceImplModule
my/app/web/ApplicationModule.java 

那么,在项目级别上,正如您所说的那样:

my/app/web/buildfile -> my/app/core/buildfile
my/app/service/impl/buildfile -> my/app/core/buildfile

但当然 web 包需要了解最终配置中的实现

my/app/web/buildfile -> my/app/impl/buildfile

没有依赖循环。在文件级别,您会获得这些依赖项(为了清楚起见,按类型描述 - java 自然不在乎)

WebServerMain -- uses --> MyService
WebServerMain -- uses --> ApplicationModule // passes it to Guice to get an Injector
ApplicationModule -- installs --> MyServiceImplModule
MyServiceImplModule -- declares --> MyService // to use as a key
MyServiceImplModule -- binds --> MyServiceImpl // as implementation of MyService
MyServiceImpl -- inherits from --> MyService

再一次,没有循环。ApplicationModule 包含服务模块(仅用于分解 - 您可以直接在 Guice.create(new MyServiceImplModule()) 中添加该模块。关键是 impl 的模块需要与

于 2013-09-17T04:53:01.257 回答