我一直在其他项目中使用 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
类放在哪里,这样我就不会从 core
到 data
存在依赖关系?
将 MyServiceModule
放入 core
或将其放入 data
将使我导入 MyServiceImpl
或 MyServiceModule
(分别)使 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/