有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Guice IoC怎么样?

我一直在其他项目中使用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);
    }
}

我正在这样的模块中开发我的项目: simple project diagram

我不想要任何循环依赖

我可以把MyServiceModule类放在哪里,这样我就不会有从coredata的依赖关系

MyServiceModule放在core或把它放在data会让我导入MyServiceImplMyServiceModule(分别)使core依赖于data模块,而data依赖于core

我是否遗漏了一些重要的概念?在春天,我会使用上下文来实现^{

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    记住,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当然不在乎)

    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的模块需要与