java - Guice IoC 怎么样?

标签 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() {
   }
   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???

我是否遗漏了一些重要的概念?在 Spring 中,我将使用上下文来获取 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

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

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

关于java - Guice IoC 怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841056/

相关文章:

ios - 为什么 Objective-C 中的 Ioc-Containers 不是一种流行的方法?

java - 有没有办法评估/衡量Java代码的效率

java - 使用泛型实现接口(interface)时返回错误

java - 如何在 Controller 中传递多个参数?

hibernate - .hbm 文件可以在 Hibernate 作为 JPA 提供者的 JPA 应用程序中使用吗?

java - DAO 在 Spring JPA 中是一个好的实践吗?

java - 在 Spring 服务层使用 HttpServletRequest

spring - JpaSpecificationExecutor 与 QueryDslPredicateExecutor

c# - LightInject GetInstance 返回不能与类型参数一起使用

c# - 如何在 XML 配置中声明 Unity InjectionFactory