Java Guice怎么样?

Java Guice怎么样?,java,spring,inversion-of-control,guice,Java,Spring,Inversion Of Control,Guice,我一直在其他项目中使用Spring,但我想尝试一下Guice。因此,我查找教程和示例,发现: public interface MyService { void serviceOperation1(); void serviceOperation2(); void serviceOperation3(); } public class MyServiceImpl implements MyService { @Inject public MyServiceImpl

我一直在其他项目中使用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);
    }
}
我正在以下模块中开发我的项目:

我不想要任何循环依赖项

我可以将
myservicecmodule
类放在哪里,这样我就不会从
core
依赖于
data

MyServiceModule
放入
core
或将其放入
data
将使我导入
MyServiceImpl
MyServiceModule
(分别)使
core
依赖于
data
模块,而
data
依赖于
core

我是否遗漏了一些重要的概念?在春季,我将使用上下文来实现
MyService


提前谢谢。

这一切都取决于你如何把事情分开。如果你把它们放在一个地方,它们将有一组依赖项

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

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自然不在乎)


这里再次强调,没有周期。ApplicationModule包括服务模块(仅用于分解-您可以在Guice.create(new MyServiceImplModule())中添加该模块)直接。问题是,impl的模块需要与

分离。你有什么问题?你有循环依赖关系吗?@nachokk是的,我想避免它。
核心
必须调用
数据
模块将数据持久化到数据库。这意味着调用
MyService.create(用户)
我必须这样做:
Injector-Injector=Guice.createInjector(新的MyServiceModule());
core
中,我不希望
core
依赖于任何“外部”模块。我必须通过设置器或其他什么来传递
注入器吗?谁负责构建对象图?thx,我正在重新阅读帖子以便更好地理解。这不是一个容易理解的概念。不过,我认为你的答案中有一部分被压缩了,看起来很重要。
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